2013-03-26 46 views
2

我正在構建使用Durandal的應用程序,並且我需要跨視圖模型共享一些功能。查看使用Durandal時的模型繼承

我有5個屏幕來構建,它們幾乎都是相同的屏幕,除了在激活功能中它們會調用不同的api端點,否則視圖和視圖模型將是相同的。

有沒有一種模式,我應該遵循正確的結構來促進代碼重用?

+0

我會看看durandal的samples文件夾,並看看masterDetail示例。我認爲這可能與你所談論的相似。 – 2013-03-26 12:52:29

回答

4

如果視圖和視圖模型除了調用不同的api動作之外都是相同的,那麼只需將一個參數作爲路徑的一部分?然後在激活功能中,可以打開參數。路由值可以被指定爲使得你的url是相關的,例如[http://site/page/subtype],其中子類型是參數(而不是使用數值)

關於繼承,取決於你需要的功能,有很多方法可以做JavaScript繼承可能會有點混亂。有些庫提供了一些全功能的繼承模型,如base2和Prototype。我已經成功地使用了John Resig also has an inheritance model

一般來說,當談到JS繼承時,我更願意堅持更簡單的解決方案。如果你需要一套完整的繼承功能,那麼這些庫是很好考慮的。如果您真的只關心從基類訪問一組屬性和函數,您可能只需將視圖模型定義爲一個函數,並將函數的原型替換爲所需的基類即可。有關繼承的詳細信息,請參閱Mozilla's Developer Docs

這裏有一個例子:

//viewModelBase 
define(function (require) { 
    "use strict"; 

    function _ctor() { 

     var baseProperty = "Hello from base"; 
     function baseFunction() { 
      console.log("Hello from base function"); 
     } 
     //exports 
     this.baseProperty = baseProperty; 
     this.baseFunction = baseFunction; 
    }; 

    //return an instance of the view model (singleton) 
    return new _ctor(); 
}); 

//view model that inherits from viewModelBase 
define(function (require) { 
    "use strict"; 

    function _ctor() { 

     var property1 = "my property value"; 
     function activate() { 
      //add start up logic here, and return true, false, or a promise() 
      return true; 
     } 
     //exports 
     this.activate = activate; 
     this.property1 = property1; 
    }; 

    //set the "base" 
    var _base = require("viewModelBase"); 
    _ctor.prototype = _base; 
    _ctor.prototype.constructor = _ctor; 

    //return an instance of the view model (singleton) 
    return new _ctor(); 
}); 

請記住這個例子中的所有結果在什麼是一個有效的單(即你只能得到相同的實例,無論多少次,你需要()的話)

如果你想要一個瞬態(非單態)只返回_ctor。然後你需要在需要()的時候實例化一個新的實例。

還有一點需要注意,一般來說,函數應該在原型上定義,而不是在構造函數本身中定義。見this link for more information on why。因爲這個例子只產生一個實例,所以這是一個有爭議的問題,所以這些函數在構造函數內部,以提高可讀性,並且還能夠訪問私有變量和函數。

+0

感謝您的建議,這是一個很好的觀點。它會繞過我概述的場景。我真的很想知道如何在視圖模型中實現繼承。 – 2013-03-26 14:17:57

+1

編輯包含一些關於繼承的其他信息。 – 2013-03-26 15:56:28

+0

非常感謝@ heiserman,真的很有幫助,在那裏學到了很多東西。你介意發佈什麼viewModelBase看起來像? – 2013-03-26 22:25:38