2012-10-04 19 views
6

Mam wspólny moduł na mojej aplikacji, który pobiera dane ze zdalnego serwera i ma metody eksportu danych do innych modułów.Jak używać RequireJS do ładowania i uruchamiania modułów tylko raz

Załóżmy, że nazwa tego modułu jest 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; 
      } 
     }; 

    }; 

}); 

Problemem jest to, kiedy określić inne moduły, które wykorzystują MyData, za każdym razem byłoby utworzyć nową instancję MyData, powodując jej odzyskać dane z serwer za każdym razem.

Mogę użyć pamięci masowej sieci Web (lub innej zmiennej globalnej) do przechowywania zwróconych danych, ale wygląda na to, że jest to złe rozwiązanie.

Czy istnieje sposób zmuszenia RequireJS do utworzenia tylko raz wystąpienia?

P.S: w moim projekcie KnockoutJS I użytkowników, a zmienna data jest ko.observable, więc może nokaut ma rozwiązanie dla mojej sytuacji?

Odpowiedz

2

RequireJS już ładuje każdy moduł jeden raz. Po prostu trzeba zrestrukturyzować swój kod nieco:

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

Zastosowanie:

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

za pomocą interfejsu Obietnica zwrócony przez $.ajax, można zapewnić asynchroniczny dostęp do danych, który jest pobierany tylko raz.

BTW, być może wzór, który próbujesz wprowadzić, to Model.

+0

Dziękuję, to było bardzo pomocne. – IgalSt

Powiązane problemy