2013-12-13 118 views
5

我想弄清楚如何使用自定義視圖位置策略,我已閱讀此頁http://durandaljs.com/documentation/Using-Composition/文檔,但我不完全明白什麼策略函數應該看起來像。Durandal自定義查看位置策略

任何人都可以給我一個快速的例子,說明這個函數的實現是什麼樣的,以及返回的承諾(即使是簡單的)等等。

由於提前, 加里

附:這是我的html代碼:

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

,這是我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; 
}); 

,但我得到的錯誤:

遺漏的類型錯誤:無法讀取屬性「顯示器」未定義 - 這是在控制檯窗口中記錄完成之後。

+0

附:我寧願通過理解來學習,所以如果有人能指出我正確的方向,我會很感激。 –

回答

1

好吧,我解決了這個由下面的創建自定義查看策略:

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

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

    return myCustomViewStrategy; 

}); 
1

因爲我發現有點欠缺上撰寫結合的策略設置的文件我檢查了源代碼,它是如何工作的。爲了薩姆起來:

通過撰寫其的moduleId結合的策略設置中指定的模塊

  • 必須返回一個名爲「戰略」
  • 它返回導致視圖是綁定一個承諾函數
  • 作爲HTML元素對象。
  • 作爲參數,策略方法接收組合綁定的設置對象
  • 並且模型對象已經解析。

工作的示例:

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的來源:

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