2012-07-03 36 views
3

我想重新渲染一個使用Marionette.ItemView
的對應模型時ItemView發生更改。綁定到ItemView的更改事件

有關啓動此任務的最佳方式的任何想法?

// Collection passed to Marionette.CompositeView 
myCollection.attributes = [ 
    { 
     id: 1, 
     name: 'bar' 
     closed: false 
    }, 
    …. 
]; 

// Marionette.ItemView 
myModel.set({ 
    closed: true 
}); // when this model change I would like to re-render the copositeView 
    // or remove the Marionette.ItemView 

P.S:
如果我嘗試在Marionette.ItemView
下面的代碼(1)當我保存模型,我得到以下錯誤(2)。

(1)

// Marionette.ItemView 
initialize: function() { 
    this.model.on('change', this.render); 
} 

(2)

Uncaught TypeError: Object [object Object] has no method 'serializeData' 
+0

我還沒有使用Marionette,但您需要綁定到視圖中的模型更改事件,以便該視圖可以理解重新呈現自身。 – jamcoupe

+0

我確實試圖在製片廠製作。ItemView,但我得到以下錯誤'未捕獲TypeError:對象[對象對象]沒有方法'serializeData'' –

回答

0

就是用_.bindAll在初始化方法一個很好的做法。可能是你的問題與範圍有關。

initialize: function() { 
    _.bindAll(this); 
    this.model.on('change', this.render); 
} 

如果bindAll沒有解決您的問題,請粘貼您的模型和視圖。

+0

謝謝,您的代碼修復了有關未捕獲TypeError:Object [對象對象]的問題。但是這個清單並沒有更新。我需要刷新頁面。無論如何,我會提出另一個問題。 –

+0

我沒有發佈關於此問題的另一個問題:[Marionette.CompositeView和Marionette.ItemView之間的事件](http://stackoverflow.com/questions/11312846/events-between-marionette-compositeview-and-marionette-itemview) –

+1

使用Marionette 'bindTo'允許Marionette在視圖關閉時停止綁定。這絕對是一種方式。 –

6

對於事件綁定和解除綁定在Marionette中自動工作,您應該使用視圖的bindTo方法。例如:

initialize: function() { 
    this.bindTo(this.model, 'change', this.render); 
} 

而且bindTo正確設置的背景下,所以你不需要_.bindAll()它。

17

Marionette提供modelEvents屬性,該屬性負責正確綁定模型事件。

在你ItemView控件只需添加以下普遍具有ItemView控件更新時模型的變化:

'modelEvents': { 
    'change': 'render' 
}, 

享受!

2

您可以啓用此行爲,在默認情況下ItemView控件改變它的原型:

Backbone.Marionette.ItemView.prototype["modelEvents"] = { "change" : "render"}; 
2

也許這有點像你想幹什麼?

MyItemView = Marionette.ItemView.extend({ 
    modelEvents: { 
     "change:closed": "render" 
    } 
}); 

MyCompositeView = Marionette.CompositeView.extend({ 
    itemView: MyItemView 
}); 

MyApp.addRegions({main_region: "#main"}); 

MyApp.main_region.show(new MyCompositeView({collection: new MyCollection()}); 

默認情況下,Marionette.ItemView具有serializeData功能,只是返回調用的toJSON在this.model的結果。當然你可以通過在你的ItemView擴展中定義你自己的serializeData來重載這個函數,就像在擴展任何其他javascript對象時一樣。 HTH

相關問題