3

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

PS:
如果我在中尝试以下代码(1)Marionette.ItemView
当我保存模型时,我会收到以下错误(2)。

(1)

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

(2)

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

5 回答 5

17

Marionette 提供了一个modelEvents属性,负责正确绑定到模型事件。

在您的ItemView中,只需添加以下内容即可在模型更改时普遍更新 ItemView:

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

享受!

于 2013-02-25T10:28:35.100 回答
6

要让事件绑定和解除绑定在 Marionette 中自动工作,您应该使用视图的bindTo方法。例如:

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

bindTo可以正确设置上下文,因此您不需要_.bindAll()它。

于 2012-07-03T17:57:46.100 回答
2

您可以在 ItemView 更改其原型时默认启用此行为:

Backbone.Marionette.ItemView.prototype["modelEvents"] = { "change" : "render"};
于 2013-03-07T14:28:32.920 回答
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 对象时一样。高温高压

于 2013-03-13T02:25:59.393 回答
0

在您的初始化方法中使用 _.bindAll 是一个好习惯。可能是您的问题与范围有关。

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

如果 bindAll 不能解决您的问题,请粘贴您的模型和视图。

于 2012-07-03T13:33:17.943 回答