为什么将子模型添加到两个父模型
Why are children models added to both parent models?
我在下面有一个示例,它创建两个父模型,然后使用自定义函数将子模型推送到父模型数组中。
JS斌:http://jsbin.com/hamuro/4/edit?html,console
var Child = Backbone.Model.extend({});
var Parent = Backbone.Model.extend({
defaults: {
children: []
},
addChild: function() {
var child = new Child();
this.get('children').push(child);
return child;
}
});
var parent1 = new Parent();
var parent2 = new Parent();
parent2.addChild();
parent2.addChild();
console.log('Parent 1 Total Children: ' + parent1.get('children').length);
console.log('Parent 2 Total Children: ' + parent2.get('children').length);
预期输出:
"家长 1 孩子总数: 0"
"家长 2 孩子总数: 2"
实际输出:
"家长 1 孩子总数: 2"
"家长 2 孩子总数: 2"
问题:
为什么即使我只指定了将子项推送到 parent2,也会将子项推送到两个父模型?
因为它们共享一个children
数组: 设置默认值时,它们由赋值设置,分配的是对数组的引用,而不是数组的副本。 例如,出于与下面的a
和b
引用同一数组相同的原因:
var a = [];
var b = a;
。只是不太直接地通过defaults
机制。
相反,您可以指定一个 defaults
函数,每次都会调用该函数以创建不同的数组:
defaults
功能:
var Parent = Backbone.Model.extend({
defaults: function() [
return {
children: []
};
},
addChild: function() {
var child = new Child();
this.get('children').push(child);
return child;
}
});
这就是文档在说时所谈论的内容:
请记住,在 JavaScript 中,对象是通过引用传递的,因此如果您将对象作为默认值包含在内,它将在所有实例之间共享。相反,
defaults
定义为函数。
也可以使用 constructor
来代替,但我不会展示一个示例,因为我不使用 Backbone 并且很容易显示一些误导性的东西(文档指向使用 defaults
函数,所以他们可能有原因)。
相关文章:
- sailsjs在创建两个模型时的错误处理
- 保存两个模型(属于第三个模型)和一个提交
- 使用包含过滤器在环回中连接两个模型
- 比较主干中的两个模型属性
- 在 ng 模型中具有单向绑定的两个输入
- 为什么将子模型添加到两个父模型
- 通过Ajax在两个视图模型中重新加载数据
- 连接angularjs中的两个范围模型
- 在一个输入文本框中绑定两个模型名称
- AngularJS - $watch内部的初始化,取决于两个模型
- AngularUI:在应用过滤器的情况下正确更新两个列表之间的模型
- 我需要在两个模型(rails)之间创建一个新关系,然后通过javascript更改关系模型的属性
- Rails-从两个模型中获取json-格式化json
- 如何在两个不同的控制器中传递ng模型的值
- 如何找到两个输入的模型函数
- 如何使用AngularJs在html中定义两个模型
- 将两个模型与一个模型传递到主干比较器,并进行字母数字排序
- 在主干的一个视图中使用两个模型时出现问题
- 在knockout js中如何在两个视图模型之间交换值
- Angular -将两个输入ng模型合并为一个