需要JS Text Plugin动态参数问题

时间:2015-05-09 17:36:34

标签: javascript requirejs

我正在尝试编写一个函数,我可以使用Require和它的文本插件来获取模板。

我希望能够调用template('modules', 'login');并让它加载所需的模板。

define(function(require) {
    return function(path, file) {
        return require('lib/text!templates/ + path + '/' + file + '.html');
    }
});

所以我的代码会抛出一个错误,但如果我硬编码这样的路径

require(lib/text!templates/modules/login.html)

它以我想要的方式工作。我尝试了使用函数中的参数的不同变体来创建带有混合结果的require的字符串参数,并记录了传递的字符串,以确保它们是相同的。有什么想法吗?

这是我回来的错误 Uncaught Error: Module name "lib/text!templates/modules/profile.html" has not been loaded yet for context: _

1 个答案:

答案 0 :(得分:0)

您可以执行您想要执行的操作,但不能使用同步功能。

当您使用require(...)作为字符串的单个参数时,您依赖于RequireJS对CommonJS需要模块的方式的支持。我们假设您在require(...)调用中放置了一个字符串文字,您说它可以工作:

define(function(require) {
    return function(path, file) {
        return require('lib/text!templates/modules/login.html');
    }
});

在幕后,RequireJS将上面的代码转换成如下代码:

define(['require', 'lib/text!templates/modules/login.html'], function(require) {
    return function(path, file) {
        return require('lib/text!templates/modules/login.html');
    }
});

请注意添加到define调用的依赖项。到require执行时,您需要的模块已经加载,一切都很好。您作为模块值返回的函数可以同步返回'lib/text!templates/modules/login.html'的值。

问题是,如果require(...)调用包含除字符串文字以外的任何内容,则此过程无效。如果您设置var x = 'lib/text!templates/modules/login.html'然后执行require(x),那么将无效! RequireJS将无法像我上面显示的那样以及{{1}时执行转换执行时,它要加载的模块尚未加载,并且失败。这只是RequireJS的限制。 require(...)的形式以字符串作为唯一参数(而不是模块列表和回调)存在 以支持CommonJS加载模块的方式。但是,如果尚未加载所需的模块,则此require(...) 形式将失败。这就是为什么RequireJS会转换出现此类调用的模块,以便将模块所需的模块添加到模块的依赖项列表中。但它可以为require调用执行此转换,这些调用具有单个参数,即字符串文字。没有别的办法。

可以做的是:

require(...)

模块返回的值是异步函数,该函数将使用模板的值调用以define(function(require) { return function(path, file, cb) { require(['lib/text!templates/' + path + '/' + file + '.html'], cb); } }); 传递的回调。