2012-10-04 8 views
6

Ich habe ein gemeinsames Modul in meiner App, das Daten vom Remote-Server abruft und über get Methoden verfügt, um die abgerufenen Daten in andere Module zu exportieren.So verwenden Sie RequireJS zum Laden und Ausführen von Modulen nur einmal

Nehmen wir an, dass dieses Modul Name ist 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; 
      } 
     }; 

    }; 

}); 

Das Problem ist, wenn ich andere Module definieren, die MyData verwenden, jedes Mal, es wäre eine neue Instanz von MyData zu schaffen, es bewirkt, dass die Daten aus der abrufen Server jedes Mal.

Ich könnte Webspeicher (oder andere globale Variable) verwenden, um die zurückgegebenen Daten zu speichern, aber es scheint wie eine schlechte Lösung.

Gibt es eine Möglichkeit, RequireJS zu zwingen, nur einmal eine Instanz zu erstellen?

P. S: In meinem Projekt ich Benutzer KnockoutJS und die data Variable ist ein ko.observable, vielleicht Knockout eine Lösung für meine Situation hat?

Antwort

2

RequireJS lädt jedes Modul bereits einmal. Sie müssen nur Ihren Code ein wenig restrukturieren:

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

Verbrauch: von $.ajax zurück

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

Durch die Verwendung der Versprechen-Schnittstelle können Sie asynch Zugriff auf Daten gewährleisten, die nur einmal abgerufen wird.

BTW, vielleicht ist das Muster, das Sie implementieren möchten, ein Modell.

+0

Vielen Dank, das war sehr hilfreich. – IgalSt