ada*_*rie 8 javascript underscore.js yeoman underscore.js-templating
我使用Yeoman和backbone.js编写了一个应用程序.在我指定的每个js文件的顶部,'use strict';当我运行我的grunt任务时,jshint不会遇到任何错误.
我可以使用grunt构建我的应用程序而没有问题但是当我尝试运行uglified js时,我收到以下错误:
Uncaught SyntaxError: Strict mode code may not include a with statement
我搜索了代码库,使用with语句的唯一内容是下划线.
我是严格模式的新手,所以我不确定如何解决这个问题.我可以在任何使用underscorejs函数的地方使用严格模式吗?
谢谢.
编辑:
给出下面的代码示例(为简洁起见缩短).我怎么能改变它来解决这个问题.
'use strict';
/*global, Backbone, JST*/
var MyView = Backbone.View.extend({
template: JST['app/scripts/templates/MyView.ejs'],
initialize: function()
{
this.render();
},
render : function()
{
this.$el.html(this.template(this.templateVariables()));
return this;
},
templateVariables: function()
{
return {var1 : 'Hello', var2 : 'World'};
}
});
Run Code Online (Sandbox Code Playgroud)
在MyView.ejs中
<p><%= var1 %><%= var2 %>!</p> //<p>Hello World!</p>
Run Code Online (Sandbox Code Playgroud)
编辑2:
在下面使用@mu太简短的答案我发现解决给我悲伤的_.template调用的最好方法是改变我的grunt-JST任务,如下所示:
jst: {
compile: {
options:
{
templateSettings:
{
variable: 'data'
}
},
files: {
'.tmp/scripts/templates.js': ['<%= yeoman.app %>/scripts/templates/*.ejs']
}
}
},
Run Code Online (Sandbox Code Playgroud)
然后更改我的每个模板以使用该<%= data.templateVariable %>格式.
可能不适用于其他人,但我使用Yeoman和Grunt以及Backbone生成器遇到了这个问题,所以我不能成为唯一一个.
mu *_*ort 18
下划线的_.template使用with在内部,让喜欢的事情<%= pancakes %>要解决,obj.pancakes.如果你看看里面_.template,你会发现:
if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
Run Code Online (Sandbox Code Playgroud)
这就是进攻的with来源.如果您正在使用JST样式的预编译模板,source那么您最终将在JST对象内部进行操作,这使得withs在范围内可见"use strict".请注意settings.variable那里?文件说:
默认情况下,模板通过
with语句将数据中的值放在本地作用域中.但是,您可以使用变量设置指定单个变量名称.这可以显着提高模板能够呈现的速度.Run Code Online (Sandbox Code Playgroud)_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'}); => "Using 'with': no"
因此,您可以在编译模板时with使用该variable选项来抑制s ; 当然,这也意味着你必须重写<%= ... %>模板的所有部分以匹配variable选项所说的内容(这也应该加快你的模板,所以它可能是值得的).
在您的情况下,您将模板更改为:
<p><%= data.var1 %><%= data.var2 %>!</p> //<p>Hello World!</p>
Run Code Online (Sandbox Code Playgroud)
然后你需要更改_.template用于编译模板的调用,如下所示:
var compiled_template = _.template(raw_template, null, { variable: 'data' });
Run Code Online (Sandbox Code Playgroud)
您data当然不必使用,您只需要在模板和_.template调用中使用相同的东西.
我不知道你如何改变设置电话的方式_.template但不应该那么困难.我想你可以将补丁作为最后的手段_.template来获得默认值variable.
这是一个简单的演示,应该说明发生了什么:http://jsfiddle.net/ambiguous/Az8QM/
或者,如果我们看看"use strict"范围如何,我们将看到:
严格模式适用于整个脚本或单个功能.
因此,您可以通过以下方式本地化您的严格性:
(function() {
"use strict";
// All your non-JST JavaScript goes here.
})();
// Append your JST out here.
Run Code Online (Sandbox Code Playgroud)
您还可以使用两个JavaScript文件而不只是一个:
"use strict"启用非模板JavaScript的.JST,这个不会 "use strict".