我想重新呈现使用Marionette.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 :(得分:17)
Marionette提供modelEvents
属性,负责处理与模型事件的正确绑定。
在 ItemView 中,只需添加以下内容即可在模型更改时普遍获得ItemView更新:
'modelEvents': {
'change': 'render'
},
享受!
答案 1 :(得分:6)
要在Marionette中自动绑定事件绑定和取消绑定,您应该使用视图的bindTo
方法。例如:
initialize: function() {
this.bindTo(this.model, 'change', this.render);
}
bindTo
也正确设置了上下文,因此您不需要_.bindAll()
。
答案 2 :(得分:2)
默认情况下,您可以在ItemView中更改其原型来启用此行为:
Backbone.Marionette.ItemView.prototype["modelEvents"] = { "change" : "render"};
答案 3 :(得分: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函数,它只返回在this.model上调用toJSON的结果。当然,您可以通过在ItemView扩展上定义自己的serializeData来覆盖此函数,就像扩展任何其他javascript对象一样。 HTH
答案 4 :(得分:0)
在初始化方法中使用_.bindAll是一种很好的做法。可能是您的问题与范围有关。
initialize: function () {
_.bindAll(this);
this.model.on('change', this.render);
}
如果bindAll无法解决您的问题,请粘贴您的模型和视图。