Ember.js Ember.ArrayController.create()不返回唯一实例

Ember.js Ember.ArrayController.create()不返回唯一实例,ember.js,Ember.js,我肯定我在这里遗漏了一些明显的东西:我正在创建3个对象,每个对象的属性都设置为ArrayController。添加每个新对象时,ArrayController实例将共享来自上一个控制器的内容,而不是唯一的实例: 在我的示例中,解决此问题的唯一方法是执行this.set('content',[])

我肯定我在这里遗漏了一些明显的东西:我正在创建3个对象,每个对象的属性都设置为ArrayController。添加每个新对象时,ArrayController实例将共享来自上一个控制器的内容,而不是唯一的实例:


在我的示例中,解决此问题的唯一方法是执行
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()中为每个实例复制该设置。一旦您意识到对象是如何创建和初始化的,这些类型的模式就很容易实现

摘自文章: