Javascript Backbone.js-模型数组上的更改事件不会在元素更改时触发

Javascript Backbone.js-模型数组上的更改事件不会在元素更改时触发,javascript,backbone.js,Javascript,Backbone.js,我有一个包含两个对象的父主干模型 1一系列主干模型 2一串 如果绑定到父级,则设置字符串的值会触发更改事件,但是在模型数组中的一个模型的属性上调用set不会触发父级上的更改事件 如何修复此问题,以便对数组中的任何模型进行任何更改都会触发父更改事件 编辑-按请求添加代码 主干模型不会将任何内容绑定到它们的属性,因此foo无法知道您正在背后更改它的一个属性。因此,当您这样做时: foo.set('models', [some_other_model]); some_other_model.set(.

我有一个包含两个对象的父主干模型

1一系列主干模型

2一串

如果绑定到父级,则设置字符串的值会触发更改事件,但是在模型数组中的一个模型的属性上调用set不会触发父级上的更改事件

如何修复此问题,以便对数组中的任何模型进行任何更改都会触发父更改事件

编辑-按请求添加代码


主干模型不会将任何内容绑定到它们的属性,因此foo无法知道您正在背后更改它的一个属性。因此,当您这样做时:

foo.set('models', [some_other_model]);
some_other_model.set(...);
实际上,您根本没有更改foo,您所做的只是直接更改foo的一个属性。模型的属性可以是任何东西,模型只是将它们视为不透明的斑点。您将遇到类似的问题,例如:

o = { a: 'b' };
m.set('p', o);
o.a = 'c';
在这两种情况下,您都是通过引用而不是通过模型的接口直接更改模型的属性

另一方面,集合确实侦听其模型上的事件。集合是模型的集合,因此它们希望其成员成为模型并相应地进行行为

如果您希望包含的模型传播“更改”事件,那么您必须自己来做,可能需要重写set以手动绑定更改处理程序来传播事件。您还可以使用内部集合而不是数组来简化事件的传播

您的默认设置中还有一个隐藏的bug。默认值将复制到新的模型实例,但该副本是浅层副本,因此,除非进行显式设置以替换引用,否则您的模型最终将共享对阵列的相同引用。例如,这:

var M = Backbone.Model.extend({
    defaults: {
      a: []
    }
});
var m1 = new M();
m1.get('a').push('pancakes');
console.log(M.prototype.defaults.a);
var m2 = new M();
console.log(m2.get('a'));

将在控制台中放置两个['pancakes'],因为m1.get'a'将返回M.prototype.defaults.a,而不是特定于m1的新空数组:​

主干模型不会将任何内容绑定到它们的属性,因此foo无法知道您正在背后更改它的一个属性。因此,当您这样做时:

foo.set('models', [some_other_model]);
some_other_model.set(...);
实际上,您根本没有更改foo,您所做的只是直接更改foo的一个属性。模型的属性可以是任何东西,模型只是将它们视为不透明的斑点。您将遇到类似的问题,例如:

o = { a: 'b' };
m.set('p', o);
o.a = 'c';
在这两种情况下,您都是通过引用而不是通过模型的接口直接更改模型的属性

另一方面,集合确实侦听其模型上的事件。集合是模型的集合,因此它们希望其成员成为模型并相应地进行行为

如果您希望包含的模型传播“更改”事件,那么您必须自己来做,可能需要重写set以手动绑定更改处理程序来传播事件。您还可以使用内部集合而不是数组来简化事件的传播

您的默认设置中还有一个隐藏的bug。默认值将复制到新的模型实例,但该副本是浅层副本,因此,除非进行显式设置以替换引用,否则您的模型最终将共享对阵列的相同引用。例如,这:

var M = Backbone.Model.extend({
    defaults: {
      a: []
    }
});
var m1 = new M();
m1.get('a').push('pancakes');
console.log(M.prototype.defaults.a);
var m2 = new M();
console.log(m2.get('a'));
将在控制台中放置两个['pancakes'],因为m1.get'a'将返回M.prototype.defaults.a,而不是特定于m1的新空数组:​