2012-10-04 12 views
6

Ho un modulo comune sulla mia app che recupera i dati dal server remoto e dispone dei metodi get per esportare i dati recuperati su altri moduli.Come utilizzare RequireJS per caricare ed eseguire moduli solo una volta

lascia supporre che il nome di questo modulo è 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; 
      } 
     }; 

    }; 

}); 

Il problema è quando mi definisco altri moduli che utilizzano MyData, ogni volta che si creerebbe una nuova istanza di MyData, inducendolo a recuperare i dati dal server ogni volta.

È possibile utilizzare la memoria Web (o un'altra variabile globale) per archiviare i dati restituiti, ma sembra una soluzione non valida.

Esiste un modo per forzare RequireJS a creare una sola istanza?

P.S: Nel mio progetto ho KnockoutJS utente e la variabile data è un ko.observable, quindi forse ad eliminazione diretta ha una soluzione per la mia situazione?

risposta

2

RequireJS carica già ciascun modulo una volta. Hai solo bisogno di ristrutturare il codice un po ':

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

Usage:

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

Utilizzando l'interfaccia Promessa restituito da $.ajax, è possibile garantire l'accesso ai dati asincrono che viene recuperato solo una volta.

BTW, forse il modello che si sta tentando di implementare è un modello.

+0

Grazie, questo è stato molto utile. – IgalSt

Problemi correlati