13

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

I am currently creating a RESTful API for one of our projects and also wanted to provide a Javascript library to access it.

Since I like the AMD principle and using require.js, I would provide an AMD module as well. The problem is: the initialization of the module would require some information like the API key on initialization.

How do I pass such parameters into a module upon initalization?

4

5 回答 5

14

如果你有类似的东西:

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

然后在某个地方需要你的模块之后,你可以调用它来初始化。如果您需要更复杂的东西并返回工厂,您可能还想研究工厂模式。

require.js 不会限制您返回的内容。它可以是一个简单的对象,一个字符串,一个函数......

于 2012-04-25T19:11:23.927 回答
6

我认为您正在寻找的是能够设置模块获取的配置变量的能力。这是一个使用 require.js 的示例

使用 AMD (require.js) 时如何在 Backbone.js 中加载引导模型

于 2012-04-25T18:32:21.327 回答
4

我想到的另一种可能性是在您请求模块时使用服务器端脚本来操作模块的源。

例如,当您必须将 API 密钥传递给模块时,您可以执行以下操作:

在进行第一次 define() 调用之前,请输入以下代码:

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

这使您可以像这样从任何地方简单地要求您的 API:

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

});

因此服务器接收到请求 - 通过 mod_rewrite 将其映射到某个脚本,获取 GET 参数并将其放在模块源代码中的正确位置,然后返回自定义源。

这就是我现在解决这个问题的方法,它就像一个魅力,不需要改变开发人员的任何行为,它利用了已经内置在 requirejs 中的功能。

于 2012-04-26T07:30:11.797 回答
1

我不认为你可以使用 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();
于 2012-04-25T16:32:16.407 回答
0

是否可以使用命名空间变量,然后在初始化特定库时引用适当的对象?也许我不明白你想要 require.js 做什么,但看起来你无论如何都从你的 main.js 调用它,所以我很确定它会工作......我不认为你可以这样做 <script = "require.js?apiKey=jsdfhjkfklsjkfdjks">

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

require(libData.apiKey); 

但是如果您需要在页面的 url 参数中发送 apikey,您可以使用这样的脚本来获取参数:

<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>
于 2012-04-25T18:16:50.857 回答