2013-12-13 18 views
5

Próbuję dowiedzieć się, jak używać niestandardowej strategii lokalizacji widoku, czytałem dokumentację na tej stronie http://durandaljs.com/documentation/Using-Composition/, ale nie do końca rozumiem, jak powinna wyglądać funkcja strategii.Durandal Custom View Lokalizacja Strategia

Czy ktoś może mi dać krótki przykład tego, jak będzie wyglądać realizacja tej funkcji i obietnica, która powróci (nawet prosta) itp.?

Dzięki z góry, Gary

PS: Jest to kod w moim HTML:

<div> 
    <div data-bind="compose: {model: 'viewmodels/childRouter/first/simpleModel', strategy: 
'viewmodels/childRouter/first/myCustomViewStrategy'}"></div> </div> 

i jest to kod w moim myCustomViewStrategy:

define(function() { 

    var myCustomViewStrategy = function() { 

     var deferred = $.Deferred(); 

     deferred.done(function() { console.log('done'); return 'simpleModelView'; }); 
     deferred.fail(function() { console.log('error'); }); 

     setTimeout(function() { deferred.resolve('done'); }, 5000); 

     return deferred.promise(); 
    }; 

return myCustomViewStrategy; 
}); 

ale pojawia się błąd:

Uncaught TypeError: nie można odczytać właściwość 'display' undefined - to jest zrobione zostało zalogowane w oknie konsoli.

+0

PS: Wolałbym się uczyć poprzez zrozumienie, więc jeśli ktoś mógłby wskazać mi właściwy kierunek, byłbym wdzięczny. –

Odpowiedz

1

Ok rozwiązałem to poprzez stworzenie mojego niestandardową strategię widok brzmienie:

define(['durandal/system', 'durandal/viewEngine'], function (system, viewEngine) { 

    var myCustomViewStrategy = function() { 
     return viewEngine.createView('views/childRouter/first/sModelView'); 
    } 

    return myCustomViewStrategy; 

}); 
1

Jak znaleźć dokumentację nieco brakuje na ustawienie strategii komponować wiązania na Sprawdziłem kod źródłowy, jak to działa. Aby summ go:

module określonym przez komponować wiążące na ustawienie strategia jego moduleId

  • musi powrócić funkcję o nazwie „strategia”
  • która zwraca obietnicę co skutkuje w celu związanie
  • jako obiekt elementu HTML.
  • Jako parametr, metoda strategii otrzymuje obiekt ustawień wiązania okładki
  • z już rozwiązanym obiektem modelu.

przykład roboczych:

define(['durandal/system', 'durandal/viewEngine'], function (system, viewEngine) { 

    var strategy = function(settings){ 
     var viewid = null; 
     if(settings.model){ 
      // replaces model's module id's last segment ('/viewmodel') with '/view' 
      viewid = settings.model.__moduleId__.replace(/\/[^\/]*$/, '/view'); 
     } 
     return viewEngine.createView(viewid); 
    }; 

    return strategy; 
}); 

źródło Durandal za:

// composition.js:485 

for (var attrName in settings) { 
    if (ko.utils.arrayIndexOf(bindableSettings, attrName) != -1) { 
     /* 
     * strategy is unwrapped 
     */ 
     settings[attrName] = ko.utils.unwrapObservable(settings[attrName]); 
    } else { 
     settings[attrName] = settings[attrName]; 
    } 
} 

// composition.js:523 

if (system.isString(context.strategy)) { 
    /* 
    * strategy is loaded 
    */ 
    system.acquire(context.strategy).then(function (strategy) { 
     context.strategy = strategy; 
     composition.executeStrategy(context); 
    }).fail(function(err){ 
     system.error('Failed to load view strategy (' + context.strategy + '). Details: ' + err.message); 
    }); 
} else { 
    this.executeStrategy(context); 
} 

// composition.js:501 

executeStrategy: function (context) { 
    /* 
    * strategy is executed 
    * expected to be a promise 
    * which returns the view to be bound and inserted to the DOM 
    */ 
    context.strategy(context).then(function (child) { 
     composition.bindAndShow(child, context); 
    }); 
}