2013-04-11 49 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