2013-12-13 31 views
5

Özel görünüm konum stratejisini nasıl kullanacağımı anlamaya çalışıyorum, bu sayfadaki dokümanları okudum http://durandaljs.com/documentation/Using-Composition/ ancak tam olarak hangi strateji işlevinin nasıl görünmesi gerektiğini anlamıyorum.Durandal Özel Görünüm Konumu Strateji

Bu işlevin nasıl uygulanacağını ve (basit bir bile olsa) geri dönen sözün nasıl olacağını hızlı bir şekilde örnek verebilir misiniz? peşin

sayesinde Gary

Not; özelliği okunamıyor 'ekran': Bu benim html kodu şöyledir:

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

ve bu benim myCustomViewStrategy içinde kod şudur:

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

ama hata alıyorum:

Yakalanmayan TypeError undefined - bu yaptıktan sonra konsol penceresinde kaydedildi.

+0

Not; Birileri beni doğru yönde gösterebilirse, minnettar olurdum diye anlayarak öğrenmeyi tercih ederim. –

cevap

1

Tamam ben takip ederek Özel görünüm stratejisi oluşturarak bu çözüldü:

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

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

    return myCustomViewStrategy; 

}); 
1

Ben nasıl çalıştığını kaynak kodunu kontrol biraz oluşturma en bağlayıcı stratejisi ayarına eksik belgeleri buldum gibi. Bunu Özet için:

oluşturma onun moduleId tarafından stratejisi ayarı en bağlanarak belirtilen modül

  • 'strateji' sınır olmak görünümünde sonuçlanan bir söz verir
  • adında bir işlev dönmelidir Bir HTML öğesi nesnesi olarak
  • .
  • Bir parametre olarak, strateji yöntemi, zaten çözülen model nesnesini oluşturan kompozisyonun ayar nesnesini
  • alır.

Bir çalışma örneği:

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

Durandal kaynak:

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