2016-08-18 9 views
3

私のジレンマは、AMDモジュールがグローバル変数を設定したり読んだりするべきではありません。しかし、データモデルには多くの別々のウィジェット(共有モデル)によって使用されるプロパティが含まれていると言えば、各ウィジェットがデータモデルオブジェクトの独自のインスタンスを保持するとは思えません。では、プロパティを取得および設定したり、プロパティの変更を監視する必要があるすべてのウィジェットがそうすることができるように、どこに配置しますか?データモデルをdojoアプリケーションに配置する場所はどこですか?

答えて

5

シングルトンパターンを使用することができます。

シングルトンは、名前空間の汚染と名前の衝突の 関連するリスクを制限するために特に重要 JavaScriptでグローバル変数の必要性を減らします。 Source

シングル・トーン・パターンをDojoに実装するには、シングル・トーン・オブジェクトであるAMDモジュールを作成できます。

次の例では、AppというAMDモジュールの定義があります。 "public"プロパティdataには、共有データを表すオブジェクトが含まれている可能性があるため、別々のAMDモジュールであるウィジェット内で使用できます。

ファンクションinitは、シングルトーンオブジェクトを初期化し、プロパティdata(たとえば、Server 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

関連する問題