2012-04-25 12 views
14

Eventuali duplicati:
How to load bootstrapped models in Backbone.js while using AMD (require.js)RequireJS - passano i parametri nel modulo per l'inizializzazione

Attualmente sto creando un'API RESTful per uno dei nostri progetti e anche voluto fornire una libreria Javascript per accedervi

Poiché mi piace il principio AMD e utilizzo require.js, fornirei anche un modulo AMD. Il problema è: l'inizializzazione del modulo richiederebbe alcune informazioni come la chiave API sull'inizializzazione.

Come si passano tali parametri in un modulo al momento dell'inizializzazione?

risposta

1

Non penso che sia possibile farlo con require.js, ma è possibile con Frame.js o qualche altra libreria di moduli. Nel fotogramma si farebbe che in questo modo:

//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

Bene, grazie - ma non cambierò il caricatore di moduli nello stato attuale del mio progetto ... –

+0

cercando un po 'di più a richiesta, potresti fare la stessa cosa con esso. – BishopZ

+0

crea un modulo che carica il modulo originale in una funzione in un oggetto globale, quindi chiama quella funzione con i parametri che desideri passare al modulo originale. – BishopZ

0

E 'possibile utilizzare una variabile namespace, e poi per fare riferimento all'oggetto appropriato quando si inizializza la libreria specifica? Forse non capisco esattamente cosa vuoi require.js, ma sembra che tu lo chiami dal tuo main.js in ogni caso, quindi sono abbastanza sicuro che funzionerebbe ... Non ti credo può farlo come <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

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

require(libData.apiKey); 

ma se è necessario inviare l'apikey nel parametro URL della pagina, è possibile utilizzare uno script come questo per ottenere i parametri:

<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; 

// tuttavia devi chiamare require, passare la chiave API?

6

Penso che la tua ricerca sia la possibilità di impostare le variabili di configurazione che vengono rilevate dal modulo. Ecco un esempio utilizzando require.js

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

+1

Questo modello è interessante. Ma se ho intenzione di creare il mio modulo AMD ufficiale per l'API in questo modo, ogni sviluppatore deve seguire questo modello - Se gli piace o no. Ma penso che sia l'unico modo per ottenere questo. –

14

Se hai qualcosa di simile:

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

    var module = { 
     ... 
    }; 

    return module; 

}); 

modificarla in:

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

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

    }; 

    return init; 
}); 

Poi, dopo che richiede il modulo da qualche parte, si può chiamare per inizializzare. Potresti anche voler esaminare il modello di fabbrica se hai bisogno di qualcosa di più complesso e restituire la fabbrica.

require.js non ti limita in ciò che restituisci. Può essere un oggetto semplice, una stringa, una funzione ...

+2

Beh, questo non funzionerà. Sto richiedendo il modulo API su diversi punti della mia applicazione e non posso inserire i parametri di initalization in ogni modulo che vuole usare l'API. Deve essere inizializzato prima che chiunque faccia uso dell'oggetto modulo esportato. –

4

Un'altra possibilità che mi è venuta in mente è utilizzare uno script serveride per manipolare l'origine del modulo quando lo si richiede.

Per esempio, quando si deve passare un-chiave API nel modulo, effettuare le seguenti operazioni:

Prima di fare la prima chiamata define(), inserire il codice seguente:

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

Ciò consente di richiedere semplicemente il vostro API da qualsiasi luogo come questo:

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

}); 

Quindi il server riceve la richiesta - lo mappa traverso mod_rewrite per alcuni script, prende il parametro GET e lo colloca nella posizione corretta nel codice sorgente del modulo, quindi restituisce l'origine personalizzata.

Questo è il modo in cui ho risolto questo problema ora e funziona come un fascino, senza la necessità di modificare alcun comportamento degli sviluppatori e si avvale di funzionalità già integrate in requirejs.

+2

Nota il carattere & alla fine dell'URL. require.js presenta alcuni problemi con i parametri GET e aggiungerà un ulteriore ".js" alla fine dell'URL richiesto. Aggiungendo il carattere finale e il carattere si assicura che la tua chiave API sia analizzata correttamente sul lato server. –

Problemi correlati