2012-07-03 37 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

相关问题