Javascript 绑定到ItemView以查看更改事件

Javascript 绑定到ItemView以查看更改事件,javascript,backbone.js,marionette,Javascript,Backbone.js,Marionette,我想重新呈现使用木偶制作的列表。ItemView 当ItemView中的相应模型更改时 你知道激活此任务的最佳方法吗 // Collection passed to Marionette.CompositeView myCollection.attributes = [ { id: 1, name: 'bar' closed: false }, …. ]; 附言: 如果我在木偶.ItemView中尝试以下代码(1),

我想重新呈现使用
木偶制作的列表。ItemView

ItemView
中的相应模型更改时

你知道激活此任务的最佳方法吗

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


附言:
如果我在
木偶.ItemView
中尝试以下代码(1),
当我保存模型时,我得到以下错误(2)

(一)

(二)


在初始化方法中使用u.bindAll是一种很好的做法。可能是您的问题与范围有关

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

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

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

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

另外,
bindTo
正确地设置了上下文,因此您不需要将
.bindAll()
与它一起使用。

木偶网提供了一个
modelEvents
属性,该属性负责正确绑定到模型事件

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

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

享受吧

默认情况下,您可以在ItemView中启用此行为并更改其原型:

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

也许这就是你想做的

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扩展上定义自己的序列化数据来覆盖此函数,就像扩展任何其他javascript对象一样。HTH

我还没有使用木偶网,但您需要绑定到视图中的模型更改事件,以便视图能够重新呈现自己。我确实尝试在木偶网.ItemView中进行此操作,但我得到以下错误
未捕获类型错误:对象[Object Object]没有方法“SerializedData”
谢谢,您的代码修复了未捕获的TypeError:Object[Object Object]的问题。但这份名单并没有更新。我需要刷新页面。无论如何,我将提出另一个问题。我确实发布了关于这个问题的另一个问题:使用木偶
bindTo
允许木偶在视图关闭时停止绑定。这绝对是正确的方法。答案在木偶网视图上使用“modelEvents”属性,因此木偶网视图和木偶网视图更适合被接受为正确答案。见:
'modelEvents': {
    'change': 'render'
},
Backbone.Marionette.ItemView.prototype["modelEvents"] = { "change" : "render"};
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()});