2012-04-25 3 views
14

Mögliche Duplizieren:
How to load bootstrapped models in Backbone.js while using AMD (require.js)RequireJS - gibt Parameter in Modul zur Initialisierung

Ich bin derzeit eine RESTful API für ein unsere Projekte zu schaffen und wollte auch eine Javascript-Bibliothek zur Verfügung zu stellen darauf zuzugreifen.

Da ich das AMD-Prinzip mag und require.js verwende, würde ich auch ein AMD-Modul bereitstellen. Das Problem ist: Die Initialisierung des Moduls würde einige Informationen wie den API-Schlüssel bei der Initialisierung erfordern.

Wie gebe ich solche Parameter bei Initialisierung an ein Modul weiter?

Antwort

1

Ich glaube nicht, dass Sie das mit require.js tun können, aber Sie können mit Frame.js oder einer anderen Modulbibliothek. Im Rahmen würden Sie das tun, wie folgt:

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

Nun danke - aber ich werde nicht die Modullader im aktuellen Zustand meines Projekts ... –

+0

Blick ein wenig mehr auf erfordern, könnten Sie die gleiche Sache damit tun. – BishopZ

+0

Erstellen Sie ein Modul, das Ihr ursprüngliches Modul in eine Funktion in einem globalen Objekt lädt, und rufen Sie diese Funktion dann mit den Parametern auf, die Sie an das ursprüngliche Modul übergeben möchten. – BishopZ

0

Ist es möglich, einen Namensraum Variable zu verwenden, und dann das entsprechende Objekt zu verweisen, wenn Sie die spezifische Bibliothek initialisieren? Vielleicht verstehe ich nicht genau, was Sie require.js tun wollen, aber es sieht so aus, als würden Sie es auf jeden Fall von Ihrem main.js aus anrufen, also bin ich mir ziemlich sicher, dass es funktionieren würde ... Ich glaube nicht, dass Sie es tun kann es tun wie <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

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

require(libData.apiKey); 

aber wenn man die apikey in der uRL-Parameter der Seite senden benötigt, könnten Sie ein Skript wie folgt um die Parameter verwenden, zu erhalten:

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

// jedoch Sie müssen anfordern, übergeben Sie den API-Schlüssel?

</script> 
6

Ich denke, was Sie suchen, ist die Fähigkeit, Konfigurationsvariablen einzustellen, die vom Modul aufgenommen werden. Hier ist ein Beispiel require.js

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

+1

Dieses Muster ist interessant. Aber wenn ich auf diese Weise mein offizielles AMD-Modul für die API erstelle, muss jeder Entwickler diesem Muster folgen - ob er es mag oder nicht. Aber ich denke, es ist der einzige Weg, dies zu erreichen. –

14

mit der Wenn Sie so etwas wie haben:

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

    var module = { 
     ... 
    }; 

    return module; 

}); 

Änderung es zu:

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

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

    }; 

    return init; 
}); 

Dann wird Ihr Modul irgendwo nach benötigen, können Sie Anruf es zu initialisieren. Sie können auch in das Fabrikmuster schauen, wenn Sie etwas Komplexeres benötigen und die Fabrik zurückgeben.

require.js beschränkt Sie nicht darauf, was Sie zurückgeben. Es kann ein einfaches Objekt, eine Zeichenfolge, eine Funktion sein ...

+2

Nun, das wird nicht funktionieren. Ich benötige das API-Modul an verschiedenen Stellen meiner Anwendung und kann die Initialisierungsparameter nicht in jedes Modul eingeben, das die API verwenden möchte. Es muss initialisiert werden, bevor jemand das exportierte Modulobjekt verwendet. –

4

Eine andere Möglichkeit, die mir in den Sinn kam, ist die Verwendung eines serverseitigen Skripts, um die Quelle des Moduls zu manipulieren, wenn Sie es anfordern.

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

Zum Beispiel, wenn Sie einen API-Schlüssel in das Modul passieren müssen, gehen Sie wie folgt vor:

Vor dem ersten tun definieren() Aufruf, den folgenden Code So können Sie einfach Ihre API benötigen von überall wie folgt aus:

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

}); 

So der Server die Anforderung recieves - ordnet es thorugh mod_rewrite zu einem gewissen Skript, führt den GET-Parameter und fügt sie an der richtigen Stelle im Modulquellcode ein und gibt dann die benutzerdefinierte Quelle zurück.

Das ist die Art, wie ich das jetzt gelöst habe und es funktioniert wie ein Charme, ohne die Notwendigkeit, Verhalten der Entwickler zu ändern und es nutzt Funktionalität, die bereits in Requirejs eingebaut ist.

+2

Beachten Sie das Zeichen & am Ende der URL. require.js hat einige Probleme mit GET-Parametern und fügt ein zusätzliches ".js" am Ende der angeforderten URL hinzu. Durch das Hinzufügen des finalen Zeichens wird sichergestellt, dass der API-Schlüssel serverseitig korrekt analysiert wird. –

Verwandte Themen