RequireJS - передать параметры в модуль для инициализации
Возможный дубликат:
Как загрузить загруженные модели в Backbone.js при использовании AMD (require.js)
В настоящее время я создаю RESTful API для одного из наших проектов, а также хочу предоставить библиотеку Javascript для доступа к ней.
Поскольку мне нравится принцип AMD и я использую require.js, я бы предоставил модуль AMD.
Проблема в том, что инициализация модуля потребует некоторой информации, такой как ключ API при инициализации.
Как передать такие параметры в модуль при инициализации?
Ответы
Ответ 1
Если у вас есть что-то вроде:
define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {
var module = {
...
};
return module;
});
измените его на:
define(['dep1', 'dep2', 'dep3'], function (dep1, dep2, dep3) {
var module = {
...
};
var init = function (options) {
// Initialize here
return module;
};
return init;
});
Затем, требуя вашего модуля где-нибудь, вы можете вызвать его для инициализации. Вы также можете просмотреть шаблон factory, если вам нужно что-то более сложное и вернуть factory.
require.js не ограничивает вас тем, что вы возвращаете. Это может быть простой объект, строка, функция...
Ответ 2
Я думаю, что вы ищете возможность устанавливать конфигурационные переменные, которые получает модуль. Вот пример использования require.js
Как загрузить загруженные модели в Backbone.js при использовании AMD (require.js)
Ответ 3
Еще одна возможность, которая пришла мне в голову, - использовать serveride script для управления источником модуля, когда вы его запрашиваете.
Например, когда вам нужно передать API-ключ в модуль, вы делаете следующее:
Прежде чем выполнить свой первый вызов define(), введите следующий код:
require.config({
paths: {
api: 'https://api.example.com/api.amd.js?api_key=f615ac61&'
}
});
Это позволяет вам просто потребовать свой API из любого места:
require(['api'], function(api){
});
Таким образом, сервер получает запрос - сопоставляет его mod_rewrite с некоторым script, принимает параметр GET и помещает его в нужное место в исходном коде модуля, а затем возвращает пользовательский источник.
То, как я решил это к настоящему времени, и это работает как шарм, без необходимости менять поведение разработчиков и использует функциональные возможности, уже встроенные в requirejs.
Ответ 4
Я не думаю, что вы можете сделать это с помощью require.js, но вы можете с Frame.js или какой-либо другой библиотекой модулей. В Frame вы сделаете так:
//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();
Ответ 5
Можно ли использовать переменную с именами, а затем ссылаться на соответствующий объект при инициализации конкретной библиотеки? Возможно, я не понимаю, что именно вы хотите require.js, но похоже, что вы вызываете это из main.js в любом случае, поэтому я уверен, что это сработает... Я не думаю, что вы может сделать это как <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">
var libData = {
apiKey: "jsdfhjkfklsjkfdjks",
otherpram: "userIDorsomething"
}
require(libData.apiKey);
но если вам нужно отправить apikey в параметр url страницы, вы можете использовать script, как это, чтобы получить параметры:
<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;
//однако вам нужно вызвать require, передать ключ api?
</script>