2013-04-11 89 views
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

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

+0

谢谢@mu。如果我的属性名称遵循它们建模的css属性(包括破折号),它会使事情变得更简单。所以现在我只需要决定哪些是较小的痛苦:在需要时用下划线替换下划线字符,或者用命名空间var来重写模板。嗯。非常感谢您的意见! – 2013-04-11 19:13:04