绑定到ItemView更改事件

时间:2012-07-03 13:13:08

标签: javascript backbone.js marionette

我想重新呈现使用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'

5 个答案:

答案 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无法解决您的问题,请粘贴您的模型和视图。