6

リモートサーバーからデータを取得するアプリに共通モジュールがありget、取得したデータを他のモジュールにエクスポートするメソッドがあります。

このモジュールの名前はMyData次のとおりです。

define([], function(){

    return function(opts) {
        var data = null;

        // go get data with ajax
        var getData = function(){
            $.ajax("getData").done(function(response){
                data = response;
            });
        };

        getData();

        // return public api
        if (arguments.length !== 0) {
            var method = arguments[0];
            switch (method) {
                case "get": return data;
            }
        };

    };

});

問題は、を使用する他のモジュールを定義するとMyData、毎回新しいインスタンスが作成され、毎回MyDataサーバーからデータが取得されることです。

返されたデータを格納するために Web ストレージ (または他のグローバル変数) を使用できますが、それは悪い解決策のようです。

RequireJS にインスタンスを 1 回だけ作成させる方法はありますか?

PS: 私のプロジェクトでは KnockoutJS を使用しており、data変数は ko.observable であるため、ノックアウトには私の状況に対する解決策があるのでしょうか?

4

1 に答える 1

2

RequireJS はすでに各モジュールを 1 回ロードしています。コードを少し再構築する必要があります。

// myModule.js
define(function() {
    // The dataFetch Promise will be initialized when this module
    // is loaded for the first time.
    var dataFetch = $.ajax("getData");

    return {
        getData: function () {
            // Return the Promise interface and let callers use the
            // .done, .fail etc. methods on it
            return dataFetch;
        }
    };
});

使用法:

define([ "myModule" ], function (myModule) {
    myModule.getData().done(function (data) {
        // use the data
    });
});

によって返される Promise インターフェースを使用する$.ajaxことで、一度だけフェッチされるデータへの非同期アクセスを保証できます。

ところで、おそらく実装しようとしているパターンはモデルです。

于 2012-10-04T16:39:30.383 に答える