无法获取变量在underscore.js模板插值而jasmine.js测试
问题描述:
编辑:忘了提醒我想起了如下设置templateSettings读者:无法获取变量在underscore.js模板插值而jasmine.js测试
_.templateSettings = {
interpolate : /\{\{([\s\S]+?)\}\}/g
};
我有一个很难得到一个varialbe插入下划线,同时运行我的Jasmine规格。鉴于模板,绘制方法,并在下面茉莉测试,我能够得到模板正确通过插值变量:
_.template(
boneHeaderInstance.template.html(),
{ id:boneHeaderInstance.id,
columns:boneHeaderInstance.columns
}
)
虽然这不能插变量列:
boneHeader = Backbone.View.extend({
el: $('#boneTableHeader'),
template: $('#boneTableHeaderTemplate'),
initialize: function(){
this.id = 'boneTableHeader';
this.el = $('#' + this.id);
this.columns = 'blah';
this.template = $('#' + this.id + 'Template');
this.render();
return this;
},
render: function(){
var that = this;
var data = {id: that.id, columns: that.columns}
this.el.html(_.template(this.template.html(), data));
}
});
模板:
<script type = 'text/template' id = 'boneTableHeaderTemplate'>
<tr id = "{{obj.id}}Row">
{{obj.columns}}
</tr>
</script>
在Render方法:
render: function(){
var that = this;
var data = {id: that.id, columns: that.columns}
this.el.html(_.template(that.template.html(), data));
}
茉莉花测试:
describe('boneHeader', function(){
beforeEach(function(){
boneHeaderInstance = boneTableInstance.header;
});
describe('rendering', function(){
it('should have expected html', function(){
expect(
boneHeaderInstance.el.html().replace(/\s\t\n/ , '', 'g')
).toEqual(
_.template(boneHeaderInstance.template.html(),
{ id:boneHeaderInstance.id,
columns:boneHeaderInstance.columns
}).replace(/\s\t\n/ , '', 'g')
);
});
});
});
茉莉花结果:
Expected ' <tr id="boneTableHeaderRow"></tr> ' to equal ' <tr id = "boneTableHeaderRow"> blah </tr> '
答
你有各种各样的问题。首先,Underscore uses <% %>
for templates除非你喜欢的东西改变它:
_.templateSettings = {
interpolate : /\{\{(.+?)\}\}/g
};
所以你的模板应该是这样的:
<script type = 'text/template' id = 'boneTableHeaderTemplate'>
<tr id = "<%= obj.id %>Row">
<td><%= obj.columns %></td>
</tr>
</script>
我也固定在你的模板有HTML错误,不能将文本节点作为<tr>
的直接子节点,并且不知道如果尝试这样的事情,浏览器会遇到什么样的问题。
其次,_.template()
通常用于返回模板的编译版本和编译的版本是,你执行得到最终的HTML功能:
var t = _.template(some_template_html);
var html = t(data);
所以,你可能要在像这样的构造函数:
this.template = _.template($('#' + this.id + 'Template').html());
,这在您的render
:
this.el.html(this.template(data));
尽管您可以一次使用_.template(template_html, context)
。
第三,如果引用在模板obj.id
和obj.columns
,但你只给它id
和columns
所以无论是从您的模板掉落obj.
前缀或改变data
正是如此:
var data = {
obj: {
id: that.id,
columns: that.columns
}
};
演示:http://jsfiddle.net/ambiguous/NYLqH/
你必须修复你的测试,以解决纠正的HTML当然。
谢谢。我以为我已经包含了'templateSettings'。我正在使用它,并会更新我的问题以反映这一点。对困惑感到抱歉。现在回顾其余的答案。 – kikuchiyo 2012-04-03 03:11:52
我仍在消化其余的答案。我同意不应该需要'obj'。你知道为什么'obj.id'和'obj.columns'在此代码'_.template( boneHeaderInstance.template.html(){ ID:boneHeaderInstance.id, 列:boneHeaderInstance.columns } )'与我的答案中提供的模板?如果没有,不要大惊小怪,只是想知道。另外,我不认为这是一个问题。考虑到它正确地插了'每茉莉花消息obj.id':'预期 '
这意味着你可能是正确的,将'{{obj.columns}}'直接放在'
相关问题