我确定我在这里一定缺少一些明显的东西:我正在创建 3 个对象,每个对象都有一个设置为 ArrayController 的属性。当我添加每个新对象时,ArrayController 实例共享来自前一个控制器的内容,而不是唯一的实例:
http://jsfiddle.net/w6DKR/3/
在我的示例中,解决此问题的唯一方法是在 ArrayController init 方法中执行this.set('content', []);
。
初始化(还有一个常见的错误!
对于 Ember 初学者来说,最常见的错误之一是认为他们正在将属性传递给实例而不是原型。例如:
var Person = Ember.Object.extend({
chromosomes: ["x"] // CAREFUL !!!!!
});
var joe = Person.create();
joe.get("chromosomes").push("y");
var jane = Person.create();
jane.get("chromosomes").push("x");
// Joe and Jane are all mixed up?!?!?!?!
console.log( joe.get("chromosomes") ); // x, y, x
console.log( jane.get("chromosomes") ); // x, y, x
为什么会发生这种染色体突变?当我们在定义 Person 类时向原型添加一个数组时,问题就开始了。然后,此数组与从 Person 实例化的每个对象共享。
我们应该如何处理这个问题?
var Person = Ember.Object.extend({
chromosomes: null,
init: function() {
this._super();
this.chromosomes = ["x"]; // everyone gets at least one X chromosome
}
});
var joe = Person.create();
joe.get("chromosomes").push("y"); // men also get a Y chromosome
var jane = Person.create();
jane.get("chromosomes").push("x"); // women get another X chromosome
// Hurray - everyone gets their own chromosomes!
console.log( joe.get("chromosomes") ); // x, y
console.log( jane.get("chromosomes") ); // x, x
在类中声明对象或数组时,通常需要将它们与 init() 函数中的每个实例一起初始化。这样,您的每个对象都将收到自己唯一的对象和数组实例。还要记住从 init() 中调用 this._super(),以便 init() 将在原型链中一直调用。
当然,如果对象或数组在实例中保持不变,那么将对象或数组直接保留在原型中并没有错。事实上,一种常见的模式是在原型中保留默认设置,然后在 init() 中为每个实例复制该设置。一旦您意识到如何创建和初始化对象,这些类型的模式就很容易实现。
摘自文章 : http://www.cerebris.com/blog/2012/03/06/understanding-ember-object/
事实上,您通常不希望在.extend({...})
块中设置content: []
,因为每个实例将共享同一个数组。AFAIK 这是 Ember 中可接受的,甚至可能很常见的模式.js:
App.MyController = Ember.ArrayController.extend({
content: null,
init: function() {
this._super();
this.set('content', []);
},
// ...
});