Ember.js Ember.ArrayController.create()不返回唯一实例
我肯定我在这里遗漏了一些明显的东西:我正在创建3个对象,每个对象的属性都设置为ArrayController。添加每个新对象时,ArrayController实例将共享来自上一个控制器的内容,而不是唯一的实例:Ember.js Ember.ArrayController.create()不返回唯一实例,ember.js,Ember.js,我肯定我在这里遗漏了一些明显的东西:我正在创建3个对象,每个对象的属性都设置为ArrayController。添加每个新对象时,ArrayController实例将共享来自上一个控制器的内容,而不是唯一的实例: 在我的示例中,解决此问题的唯一方法是执行this.set('content',[])
在我的示例中,解决此问题的唯一方法是执行
this.set('content',[])实际上,您通常不希望在.extend({…})
块内设置内容:[]
,因为每个实例将共享同一个数组。AFAIK这是一种可以接受的模式,甚至在Ember.js中很常见:
App.MyController = Ember.ArrayController.extend({
content: null,
init: function() {
this._super();
this.set('content', []);
},
// ...
});
实际上,您通常不希望在.extend({…})
块中设置内容:[]
,因为每个实例将共享同一个数组。AFAIK这是一种可以接受的模式,甚至在Ember.js中很常见:
App.MyController = Ember.ArrayController.extend({
content: null,
init: function() {
this._super();
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()中调用这个。_super(),这样init()将在原型链的整个过程中被调用
当然,如果对象或数组在实例中保持不变,那么直接在原型中保留它们并没有什么错。事实上,一种常见的模式是在原型中保留一个默认设置,然后在init()中为每个实例复制该设置。一旦您意识到对象是如何创建和初始化的,这些类型的模式就很容易实现
摘自文章:初始化(和一个常见错误!)
对于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()中调用这个。_super(),这样init()将在原型链的整个过程中被调用
当然,如果对象或数组在实例中保持不变,那么直接在原型中保留它们并没有什么错。事实上,一种常见的模式是在原型中保留一个默认设置,然后在init()中为每个实例复制该设置。一旦您意识到对象是如何创建和初始化的,这些类型的模式就很容易实现
摘自文章: