2016-08-18 25 views
3

我的兩難處境是,在dojo文檔中建議AMD模塊不應設置或讀取全局變量。但是,假設您的數據模型包含許多獨立窗口小部件(因此它是一個共享模型)使用的屬性,那麼期望每個窗口小部件都保存它自己的數據模型對象實例是不合理的。那麼你在哪裏放置它,以便所有需要獲取和設置屬性或觀看屬性更改的小部件都可以這樣做?您將數據模型放在dojo應用程序中的哪個位置?

回答

5

您可以使用Singletone模式。

單身減少全局變量的需求,因爲它限制命名空間污染和 相關的名稱衝突的風險是在JavaScript中尤爲重要 。 Source

要在Dojo中實現Singletone模式,您可以創建一個AMD模塊,這是一個單音對象。

在以下示例中,您定義了一個名爲App的AMD模塊。 「公共」屬性data可能包含代表您的共享數據的任何對象,因此您可以在與AMD模塊分離的小部件中使用它。

函數init可用於初始化單音對象並填充屬性data(例如向您的服務器API發出請求)。

bootstrap AMD模塊(這是你的應用程序的入口點),顯示瞭如何時,你需要讓你的小部件中的「共享」的數據加載首次app AMD模塊,並對其進行初始化,從你那點可以請求應用和數據app().data;


app.js文件

define([ 

], function (

    ) { 
    'use strict'; 
    var _instance; 
    function _App() { 
    } 
    _App.prototype = { 
     // data: [public] Object 
     //  Data for your app. 
     data: null, 
     init: function() { 
      // summary: 
      //  Initializes and fetch some data from the server. 
     } 
    }; 
    return function _getSingleton() { 
     // summary: 
     //  Gets singleton object. 
     return (_instance = (_instance || new _App())); 
    }; 
}); 

bootstrap.js文件

require([ 
    'app' 
    ], function (
    app 
    ) { 
    'use strict'; 
    // module: 
    //  bootstrap 
    // summary: 
    //  Application bootstrap with the main responsibility to initiate modules (single tones). 
    // initializes module app 
    app().init();  
}); 
+0

_App已經是一個功能? – erotavlas

+0

@erotavlas在javascript中,函數是第一個類對象,下面的代碼_App必須是一個函數。我希望這個答案能幫助你。如果您需要更多信息,請讓我知道。 – GibboK

相關問題