2012-09-05 46 views
16

我開發了一個jquery & backbone.js web應用程序。
一個組件有一個html表,在這個表的後面是一個backbone.js集合。
這個集合中的任何變化應導致HTML表的更新,所以我寫backbone.js收集事件

this.collection.bind("reset add remove", this.renderRows, this);  

所以我更新HTML表,當整個收集得到新的,當一個新的模式被添加和當模型被刪除。

還有一個細節視圖組件,當用戶懸停並點擊某個html表格的某一行時,該組件會被調用。在此組件的開始,我得到正確的模型從集合中

changeModel = this.collection.get(id); 

用戶已經改變了一些屬性後,我做

changeModel.set(attrs); 

,並返回HTML表。集合中的模型具有正確的更改值。

但是html表沒有被更新,因爲3個事件(重置,添加,刪除)中沒有一個被觸發。

所以我說「取代」到集合結合

this.collection.bind("replace reset add remove", this.renderRows, this); 

,並從細節視圖返回之前我叫

this.collection.trigger("replace"); 

我的解決方案的工作,但我的問題是:

是否有任何「原生」backbone.js解決方案已經存在,並且我已經錯過了,我不需要自己觸發某些東西?

回答

46

模型中的change事件會觸發集合。 (集合的_onModelEvent - 函數在annotated source。該方法基本上只是發生的所有事件的模式和觸發它們的集合。

這導致

  1. 型號屬性設置
  2. 型號觸發change
  3. 收集捕捉change
  4. 採集觸發change

所以

this.collection.bind("replace reset add remove", this.renderRows, this); 

必須與此

this.collection.bind("change reset add remove", this.renderRows, this); 

希望這有助於更換!

P.S.

我個人認爲,如果只更改一個模型,則不應該重繪整個表格。取而代之的是讓每個表格都有一個視圖本身,它有相應的模型作爲模型,然後對那裏的屬性變化作出反應。如果您只針對一個表格,則重繪500個表格單元毫無意義。

UPDATE

而如今,你應該使用on - 方法結合事件。

collection.on("change reset add remove", this.renderRows, this); 

如果您在使用BB 1.0,並且該事件被一個View內聽了,我建議把使用新listenTo綁定到事件,這也可以很容易地解除綁定調用view.remove()時。在這種情況下,你應該這樣做:

// assuming this is the view 
this.listenTo(collection, "change reset add remove", this.renderRows); 
+4

謝謝。我認爲你應該在原始答案前加上一句話,比如說:「自從我首次寫這篇文章以來,Backbone增加了一些便利,如果你使用的是最新的Backbone,請參閱下面的UPDATE。」對於我們中的一些人來說,20多條看起來像答案的線條接近極限。再次感謝,樂於助人。 –

+0

同意的「更新」應該在最上面,但是那些格式很好的20行解釋和代碼,我沒有問題通讀它。 – Gal