使用lodash时,有没有办法为RequireJS设置templateSettings
?
现在我的主要创业公司
require(['lodash', 'question/view'], function(_, QuestionView) {
var questionView;
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g,
evaluate: /\{\%(.+?)\%\}/g
};
questionView = new QuestionView();
return questionView.render();
});
但似乎并不想全局设置templateSettings
,因为当我在模块中使用_.template(...)
时,它希望使用默认的templateSettings
。问题是我不想在使用_.template(...)
的每个模块中更改此设置。
答案 0 :(得分:16)
基于@Tyson Phalp建议,这意味着this SO question。
我根据您的问题对其进行了调整,并使用RequireJS 2.1.2和SHIM configuration对其进行了测试
这是main.js
文件,这是requireJS配置的位置:
require.config({
/* The shim config allows us to configure dependencies for
scripts that do not call define() to register a module */
shim: {
underscoreBase: {
exports: '_'
},
underscore: {
deps: ['underscoreBase'],
exports: '_'
}
},
paths: {
underscoreBase: '../lib/underscore-min',
underscore: '../lib/underscoreTplSettings',
}
});
require(['app'],function(app){
app.start();
});
然后你应该使用你的templateSettings创建underscoreTplSettings.js
文件,如下所示:
define(['underscoreBase'], function(_) {
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g
};
return _;
});
因此,您的模块underscore
将包含下划线库和模板设置
从您的应用程序模块中只需要underscore
模块,这样:
define(['underscore','otherModule1', 'otherModule2'],
function( _, module1, module2,) {
//Your code in here
}
);
我唯一的疑问是我输出相同的符号_
两次,即使这项工作很艰难,我也不确定这是否是一种好的做法。
=========================
替代解决方案: 这也很好,我想它更干净,避免创建和需要额外的模块作为上述解决方案。我使用初始化函数更改了Shim配置中的'export'。有关进一步了解,请参阅Shim config reference。
//shim config in main.js file
shim: {
underscore: {
exports: '_',
init: function () {
this._.templateSettings = {
evaluate:/\{\{(.+?)\}\}/g,
interpolate:/\{\{=(.+?)\}\}/g,
escape:/\{\{-(.+?)\}\}/g
};
return _; //this is what will be actually exported!
}
}
}
答案 1 :(得分:0)
您应该将 _ 变量与模板设置作为函数参数或全局对象中的属性(浏览器的窗口)或nodejs的 proccess 传递)。
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g,
evaluate: /\{\%(.+?)\%\}/g
};
questionView = new QuestionView(_);
或者
_.templateSettings = {
interpolate: /\{\{(.+?)\}\}/g,
evaluate: /\{\%(.+?)\%\}/g
};
window._ = _
第一种选择更好。
答案 2 :(得分:0)
请记住,如果您使用下划线> = 1.6.0或lodash-amd,解决方案非常简单:
“main.js”配置文件
require.config({
baseUrl: './', // Your base URL
paths: {
// Path to a module you create that will require the underscore module.
// You cannot use the "underscore" name since underscore.js registers "underscore" as its module name.
// That's why I use "_".
_: 'underscore',
// Path to underscore module
underscore: '../../bower_components/underscore/underscore',
}
});
您的“_.js”文件:
define(['underscore'], function(_) {
// Here you can manipulate/customize underscore.js to your taste.
// For example: I usually add the "variable" setting for templates
// here so that it's applied to all templates automatically.
// Add "variable" property so templates are able to render faster!
// @see http://underscorejs.org/#template
_.templateSettings.variable = 'data';
return _;
});
模块文件。它需要我们的“_”模块,它需要“下划线”并对其进行修补。
define(['_'], function(_){
// You can see the "variable" property is there
console.log(_.templateSettings);
});