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 не ограничивает вас тем, что вы возвращаете. Это может быть простой объект, строка, функция...

Ответ 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>