下划线模板:使用空间传递骨干模型属性

时间:2013-04-11 17:33:08

标签: backbone.js underscore.js

我有一个具有空格属性的模型。这似乎没问题。但是,我无法将其传递给下划线模板。

有关我的确切问题,请参阅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));

尝试寻找解决方案,但到目前为止没有运气。

谢谢!

1 个答案:

答案 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变量名称,那么问题就会消失。