2012-04-25 11 views
14

Duplicar posibles:
How to load bootstrapped models in Backbone.js while using AMD (require.js)RequireJS - pasan parámetros en el módulo de inicialización

Actualmente estoy creando una API REST para uno de nuestros proyectos, y también quería ofrecer una biblioteca javascript acceder a él.

Como me gusta el principio de AMD y el uso de require.js, también proporcionaría un módulo de AMD. El problema es que la inicialización del módulo requeriría cierta información, como la clave de la API en la inicialización.

¿Cómo transfiero esos parámetros a un módulo después de la inicialización?

Respuesta

1

No creo que pueda hacer eso con require.js, pero puede hacerlo con Frame.js o alguna otra biblioteca de módulos. En el fotograma que haría que de esta manera:

//moduleName.js 

(function(exports){ 
    exports.moduleName = function(args){ 
     // do stuff 
    } 
})(window.exports); 


// in main js file 

var exports = {}; // global variable 

Frame('moduleName.js'); 
Frame(function(next){ 
    var myArgs = { ... settings ... }; 
    exports.moduleName(myArgs); 
    next(); 
}); 
Frame.init(); 
+0

Bien, gracias, pero no cambiaré el cargador de módulos en el estado actual de mi proyecto ... –

+0

buscando un poco más en requerir, podría hacer lo mismo con él. – BishopZ

+0

crea un módulo que carga tu módulo original en una función en un objeto global, luego llama a esa función con los parámetros que deseas pasar al módulo original. – BishopZ

0

¿Es posible utilizar una variable de espacio de nombres y, a continuación, hacer referencia al objeto apropiado al inicializar la biblioteca específica? Tal vez no entiendo exactamente lo que quieres requerir.js hacer, pero parece que lo llamas desde main.js en cualquier caso, así que estoy bastante seguro de que funcionaría ... No creo que lo puede hacer como <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

var libData = { 
    apiKey: "jsdfhjkfklsjkfdjks", 
    otherpram: "userIDorsomething" 
} 

require(libData.apiKey); 

pero si usted necesita para enviar el apikey en el parámetro url de la página, se puede utilizar un script como el siguiente para obtener los parámetros:

<script> 
     function getQueryParams(qs) { 
      qs = qs.split("+").join(" "); 
      var params = {}, 
       tokens, 
       re = /[?&]?([^=]+)=([^&]*)/g; 

      while (tokens = re.exec(qs)) { 
       params[decodeURIComponent(tokens[1])] 
        = decodeURIComponent(tokens[2]); 
      } 

      return params; 
     } 

// assuming the page is loaded like page.html?apikey=jsdfhjkfklsjkfdjks 

    apiKey = getQueryParams(document.location.search).apiKey; 

// embargo tienes que llamar require, pasar la clave api?

</script> 
6

Creo que lo que buscas es la capacidad de establecer variables de configuración que el módulo recupere. Aquí está un ejemplo usando require.js

How to load bootstrapped models in Backbone.js while using AMD (require.js)

+1

Ese patrón es interesante. Pero si voy a crear mi módulo AMD oficial para la API de esta manera, cada desarrollador debe seguir ese patrón, si le gusta o no. Pero creo que es la única forma de lograr esto. –

14

Si usted tiene algo así como:

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) { 

    var module = { 
     ... 
    }; 

    return module; 

}); 

cambio a:

define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) { 
    var module = { 
     ... 
    }; 

    var init = function (options) { 
     // Initialize here 
     return module; 

    }; 

    return init; 
}); 

Luego, después de que requiere su módulo en alguna parte, que pueda llame al para inicializar. También puede consultar el patrón de fábrica si necesita algo más complejo y devolver la fábrica.

require.js no lo restringe en lo que devuelve. Puede ser un objeto simple, una cadena, una función ...

+2

Bueno, eso no funcionará. Estoy requiriendo el módulo API en diferentes lugares de mi aplicación y no puedo poner los parámetros de initalización en cada módulo que quiera usar la API. Tiene que inicializarse antes de que cualquiera haga uso del objeto de módulo exportado. –

4

Otra posibilidad que me vino a la mente es utilizar un script en el servidor para manipular el origen del módulo cuando lo solicite.

Por ejemplo, cuando usted tiene que pasar una clave de API en el módulo, haga lo siguiente:

Antes de hacer su primera llamada definir(), poner el siguiente código:

require.config({ 
    paths: { 
     api: 'https://api.example.com/api.amd.js?api_key=f615ac61&' 
    } 
}); 

esto le permite simplemente requieren su API desde cualquier lugar de esta manera:

require(['api'], function(api){ 

}); 

Así que el servidor recieves la solicitud - mapea thorugh mod_rewrite para una secuencia de comandos, toma el parámetro GET y lo pone en el lugar correcto en el código fuente del módulo, luego devuelve la fuente personalizada.

Esa es la forma en que he resuelto esto por ahora y funciona como un encanto, sin la necesidad de cambiar el comportamiento de los desarrolladores y hace uso de la funcionalidad que ya está integrada en requirejs.

+2

Observe el & carácter al final de la URL. require.js tiene algunos problemas con los parámetros GET y agregará un ".js" adicional al final de la URL solicitada. Al agregar el carácter y final, se asegura de que su clave api se analice correctamente en el servidor. –

Cuestiones relacionadas