我有一个具有空格属性的模型。这似乎没问题。但是,我无法将其传递给下划线模板。
有关我的确切问题,请参阅this fiddle。
var Person = Backbone.Model.extend({
defaults: {
'first name' : 'Mendel'
}
});
var person = new Person();
var template = _.template("Hello <%= 'first name' %>!");
console.log(person.get('first name'));
// Possible ??
console.log(template(person.attributes));
尝试寻找解决方案,但到目前为止没有运气。
谢谢!
答案 0 :(得分:4)
根本问题是_.template
:
默认情况下,模板会通过
with
语句将数据中的值放在本地范围内。
因此,您在<%= ... %>
中使用的所有内容都被假定为有效的JavaScript变量名称。您的first name
不是有效的JavaScript变量名称,因此一切都崩溃了。
快速解决方案是手动命名所有内容,以便您可以使用[]
来获取您的属性,从而避免“JavaScript变量名称不能包含空格”问题:
var template = _.template("Hello <%= person['first name'] %>!");
console.log(template({ person: person.attributes}));
演示:http://jsfiddle.net/ambiguous/5v7XQ/
如果您不介意升级您的Underscore(一个好主意),那么您可以使用data
option:
但是,您可以使用变量设置指定单个变量名称。这可以显着提高模板渲染的速度。
_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'}); => "Using 'with': no"
然后你可以这样做:
var template = _.template("Hello <%= person['first name'] %>!", null, { variable: 'person' });
console.log(template(person.attributes));
演示:http://jsfiddle.net/ambiguous/NXhSN/
另一种选择是停止使用名称中包含空格的属性。如果所有模型属性名称也是有效的JavaScript变量名称,那么问题就会消失。