2012-03-02 63 views
4

我試圖讓我的handlebars.js模板做這樣的事情:如何在handlebars.js模板中使用getters?

<li>{{ user.get('firstName') }} {{ user.get('lastName') }}</li> 

顯然不過,這不是工作。 handlebars.js是否有允許直接使用getter的語法?

謝謝。

回答

0

<li>{{user.firstName}} {{user.lastName}}</li>

但如果它在一個循環的(從<li>假設)應該是{{this.firstname}}

+0

這是錯誤的。骨幹模型是帶有set()get()的對象。我認爲這個問題是關於在上下文中傳遞這些對象中的一個而不必調用.toJSON()。更一般地說,我如何使用json對象來處理真正的js對象而不是json?調用上下文對象方法的推薦方法是什麼?或者我不是想?謝謝 – cancerbero 2014-11-26 22:47:51

+0

@cancerbero,一個不需要骨幹使用車把。鑑於上下文,我的回答是正確的。 – soemarko 2014-11-27 09:09:49

0

這是工作在車把上,basicallya助手,然後使用{{拿到書 「稱號」}}:

Handlebars.registerHelper('get', function(model, attributeName) 
{ 
    return model.get(attributeName); 
}); 

var templateStr = '<div class="book-title">{{get preferredBook "title"}}</div>'; 

var Book = Backbone.Model.extend({}); 
var b = new Book({title: 'Lord of the rings'}); 
var context = { 
    preferredBook: b 
}; 

var template = Handlebars.compile(templateStr); 

var output = template(context); 
expect(output).toBe('<div class="book-title">Lord of the rings</div>'); 
0

更好,但是時間自定義句柄編譯器。需要在腳本中添加以下代碼,用於使用COMPILE模板,而不是在運行時。將此代碼添加到編譯代碼中,而不是運行時 - 這不是幫助程序)。然後你可以直接編寫{{model.title}},這個表達式將被編譯器自動翻譯成model.get('title')。當然,如果'model'不是Backbone.Model,那麼它將像往常一樣訪問json屬性。

Handlebars.JavaScriptCompiler.prototype.nameLookup = function(parent, name) 
{ 
    var result = '((typeof(Backbone)!="undefined" && ' + parent + ' instanceof Backbone.Model) ? ' + parent + '.get("' + name + '") : ' + parent; 
    if (/^[0-9]+$/.test(name)) 
    { 
     return result + '[' + name + '])'; 
    } 
    else if (Handlebars.JavaScriptCompiler.isValidJavaScriptVariableName(name)) 
    { 
     return result + '.' + name + ')'; 
    } 
    else 
    { 
     return result + '[\'' + name + '\'])'; 
    } 
};