2013-05-04 41 views
1

我在探索一個使用HandelbarsJS和Backbone的設置。BackboneJS與HandelbarJS:如何訪問模型功能?

這是我的模板的一部分:

<a href="#genre/{{ name }}" class="genre-item" data-genre="{{ name }}"> 
    <i class="icon-chevron-{{#if is_selected }}down{{else}}right{{/if}}"></i> 
    {{ display_name }} ({{ total }}) 
</a> 

含義:我想呈現一個不同的圖標,這取決於模型是否選擇與否。 但是,我從來沒有得到'圖標 - 人字形 - 下',但總是'圖標 - 人形 - 正確'的路徑。 任何想法我失蹤?

編輯

一個流派的選擇正在喜歡這款機型的水平:

 
MA.Models.Genre = Backbone.Model.extend({ 
    defaults: { 
     selected: false 
    }, 

    is_selected: function() { 
     return (this.get('selected') == true); 
    }, 

    toggle: function() { 
     if (this.is_selected()) { 
      this.set('selected', false); 
     } 
     else 
     { 
      this.set('selected', true); 
     } 
    } 
}); 

MA.Collections.Categories = Backbone.Collection.extend({ 
    model: MA.Models.Genre 
}); 

這也許可以簡化,但我不能從遠程服務獲取類型的選擇,但它只是作爲暫時的狀態改變而使用。

回答

2

沒有看到您的視圖中發生了什麼,很難說。但你可能有一個渲染功能,看起來像:

HandlebarsTemplate['templatename'](this.model.toJSON()); 

toJSON默認情況下,只包含模型屬性。此外,handlebars不會像這樣在即時評估函數。

最簡單的解決方法是修復模板的樣子:

<a href="#genre/{{ name }}" class="genre-item" data-genre="{{ name }}"> 
    <i class="icon-chevron-{{#if selected }}down{{else}}right{{/if}}"></i> 
    {{ display_name }} ({{ total }}) 
</a> 

我已經改變了is_selectedselected使用屬性,而不是功能。

另一種選擇是修改模型的toJSON功能包括評價功能:

MA.Models.Genre = Backbone.Model.extend({ 
    defaults: { 
     selected: false 
    }, 

    is_selected: function() { 
     return (this.get('selected') == true); 
    }, 

    toJSON: function(options) { 
     var attrs = _.clone(this.attributes); 
     attrs.is_selected = this.is_selected(); 
     return attrs; 
    } 
}); 
+0

我的問題是,我沒有打電話渲染,但只是部分的顯示/隱藏部分HTML。所以,我想我需要重新渲染視圖。並注意JSON是正確的。 – poseid 2013-05-05 08:03:02