2015-05-09 60 views
0

我想写一个函数,我可以用它来拉我的模板与需求和它的文本插件。要求JS文本插件动态参数问题

我希望能够呼叫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

你可以做你想做的事,但不与同步功能是什么。

当您使用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将不能像上面显示的那样执行转换,并且当require(...)执行时,它要加载的模块尚未加载,并且失败。这仅仅是RequireJS的一个限制。形式require(...)以字符串作为唯一参数(而不是模块和回调列表)存在完全以支持CommonJS加载模块的方式。但是,如果所需模块尚未加载,则此形式的require将失败。这就是为什么RequireJS会将出现此类调用的模块进行转换,以便将模块所需的模块添加到模块的相关性列表中。但它可以执行此转换只有require(...)调用具有单个参数是一个字符串文字。没有其他人会做。

可以做的是什么:

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

由模块返回的值是一个异步功能,它会调用作为cb通过与模板的价值回调。