我正在尝试编写一个函数,我可以使用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: _
答案 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);
}
});
传递的回调。