2

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

请参阅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));

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

谢谢!

4

1 回答 1

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/

如果您不介意升级下划线(一个好主意),那么您可以使用以下data选项

但是,您可以使用变量设置指定单个变量名称。这可以显着提高模板的渲染速度。

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

于 2013-04-11T18:44:28.967 回答