2012-10-04 7 views
6

私は、リモートサーバーからデータを取得し、取得したデータを他のモジュールにエクスポートするための共通のモジュールをアプリケーションに持っています。RequireJSを使用してモジュールを一度だけロードして実行する方法

このモジュールの名前は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の新しいインスタンスを作成しますサーバーごとに。

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

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

P.S:私のプロジェクト私のユーザーKnockoutJSで 、およびdata変数はko.observable、ので、多分ノックアウトが私の状況のた​​めのソリューションを持っているのですか?

答えて

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 
    }); 
}); 

$.ajaxによって返さ約束インターフェイスを使用することにより、あなたは1回だけ取得のデータへの非同期アクセスを確保することができます。

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

+0

ありがとう、これは非常に役に立ちました。 – IgalSt

関連する問題