2013-12-13 11 views
5

Sto cercando di capire come utilizzare una strategia di localizzazione personalizzata, ho letto la documentazione in questa pagina http://durandaljs.com/documentation/Using-Composition/ ma non capisco esattamente come dovrebbe essere la funzione di strategia.Durandal Custom View Location Strategy

Qualcuno può darmi un rapido esempio di come sarebbe l'implementazione di questa funzione e della promessa che restituisce (anche se semplice) ecc.?

Grazie in anticipo, Gary

P.S. Questo è il codice nel mio html:

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

e questo è il codice nel mio 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; 
}); 

ma ottengo l'errore:

Uncaught TypeError: Impossibile leggere proprietà 'display' di indefinito - questo è dopo che è stato registrato nella finestra della console.

+0

P.S. Preferirei imparare comprendendo in modo che se qualcuno potesse indicarmi la direzione giusta sarei grato. –

risposta

1

Ok ho risolto questo con la creazione di mia strategia visualizzazione personalizzata dal seguente:

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

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

    return myCustomViewStrategy; 

}); 
1

Come ho trovato la documentazione un po 'carente sul impostazione strategia vincolante di composizione ho controllato il codice sorgente come funziona. Per summ in su:

il modulo specificato legando la composizione del impostazione strategia per la sua moduleId

  • deve restituire una funzione denominata 'strategia'
  • che restituisce una promessa che si traduce nella visualizzazione di essere vincolato
  • come oggetto elemento HTML.
  • Come parametro, il metodo di strategia riceve l'oggetto delle impostazioni del binding di composizione
  • con l'oggetto modello già risolto.

Un esempio di lavoro:

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; 
}); 

fonte di Durandal:

// 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); 
    }); 
}