2012-10-04 29 views
6

Tengo un módulo común en mi aplicación que recupera datos del servidor remoto y tengo los métodos get para exportar los datos recuperados a otros módulos.Cómo usar RequireJS para cargar y ejecutar módulos solo una vez

supongamos que el nombre de este módulo es 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; 
      } 
     }; 

    }; 

}); 

El problema es cuando defino otros módulos que utilizan MyData, cada vez que se crearía una nueva instancia de MyData, haciendo que para recuperar los datos de la servidor cada vez.

Podría utilizar el almacenamiento web (u otra variable global) para almacenar los datos devueltos, pero parece una mala solución.

¿Hay alguna manera de obligar a RequireJS a crear solo una vez?

P.S: en mi proyecto KnockoutJS que el usuario, y la variable data es un ko.observable, así que tal vez nocaut tiene una solución para mi situación?

Respuesta

2

RequireJS ya carga cada módulo una vez. Sólo tiene que reestructurar su código un poco:

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

Uso:

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

Mediante el uso de la interfaz Promise devuelto por $.ajax, se puede garantizar el acceso a los datos asynch que se fue a buscar sólo una vez.

Por cierto, tal vez el patrón que está tratando de implementar es un Modelo.

+0

Gracias, esto fue muy útil. – IgalSt

Cuestiones relacionadas