0

状態を保持できるように、dojo(1.8)モジュールに静的変数を含める方法はありますか?

たとえば、some/moduleに値を設定したとします

require([
     'some/module'
], function (module) {
    module.setSomeValue(3); 
});

..そして後でそれを取得したい

define([
    'some/module'
], function(module) {
    return {
        start: function() {
            var x = module.getSomeValue(); 
        }
    };
});

動作するがハックのように見えるソリューション、

acompany = window.acompany || {};
acompany.project = acompany.project || {
};

require([       
], function() {
    var debug = false;

    acompany.project.module = {
        /* static variables and functions here */ 
    };
});

define([

], function () {
    return acompany.project.module;
});
4

2 に答える 2

1

実際には、AMDモジュールのインスタンスは常に1つだけです。これは、(ソース):

defineには、すぐには明らかにならない可能性のある2つの追加の重要な特性があります。

  • モジュールの作成は遅延して非同期であり、defineが呼び出されてもすぐには発生しません。これは、ファクトリが実行されず、実行中のコードが実際にモジュールを必要とするまで、モジュールの依存関係が解決されないことを意味します。
  • モジュール値がモジュール名前空間に入力されると、要求されるたびに再計算されることはありません。実際のレベルでは、これはファクトリが1回だけ呼び出され、戻り値がキャッシュされ、特定のモジュールを使用するすべてのコード間で共有されることを意味します。(注:dojoローダーには、モジュール値の定義を解除する非標準関数require.undefが含まれています。)

さらに、ファクトリ関数だけを提供する必要はありません。オブジェクトリテラルも提供できます。

define("some/module", {
    someValue: "some",
    otherValue: "other"
});

次に、コード内の別の場所:

require(["some/module"], function(module) {
    console.log("module.someValue", module.someValue); // some
    module.someValue = "some changed";
});

require(["some/module"], function(module) {
    console.log("module.someValue", module.someValue); // some changed
});

より堅牢なソリューションにはのインスタンスが含まれているため、変更を加えたり、カスタムセッターゲッターを定義したりdojo/Statefulできます。watch

define("some/stateful-module", ["dojo/Stateful"], function(Stateful){
    var stateful = new Stateful({
        someValue: "some",
        otherValue: "other"       
    });
    return stateful;
});

次に、コード内の別の場所:

require(["some/stateful-module"], function(module) {
    console.log("stateful-module.someValue:", module.get("someValue"));
    module.watch(function(name, oldValue, newValue) {
        console.log("stateful-module: property"
            , name
            , "changed from"
            , "'" + oldValue + "'"
            ,  "to"
            , "'" + newValue + "'"
        );        
    });
});

require(["some/stateful-module"], function(module) {
    module.set("someValue", "some changed");
});​

jsFiddleでどのように機能するかを確認してください:http://jsfiddle.net/phusick/fHvZf/。そこには単一のファイルがありますが、モジュールを使用しない限り、アプリケーション全体で同じように機能require.undef(mid)します。

于 2012-10-08T18:56:26.463 に答える
0

Dojoにはdojo/date/locale、を使用するウィジェット/クラスではなく、静的変数と関数を定義するような複数のファイルがありますdojo.declare

モジュールを定義する

define([
    'dojo/_base/lang/',
    'some/module'
], function(lang, module) {

    var m = lang.getObject('some.module', true);
    m.x = 0;
    m.doSomething = function(){
      // doSomething
    };
    return m;
});

モジュールを使用する

require([
    'some/module'
], function(someModule) {
    var debug = false;

    /* someModule - static variables and functions here */ 

    if(someModule.x == 0){

    }
});
于 2012-10-08T18:07:04.390 に答える