0

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

http://jsfiddle.net/w6DKR/3/

在我的示例中,我可以解决此问题的唯一方法是this.set('content', []);在 ArrayController init 方法中执行此操作。

4

2 回答 2

3

初始化(也是一个常见的错误!)

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/

于 2012-08-15T19:56:24.777 回答
2

实际上,您通常不希望在块content: []内进行设置,.extend({...})因为每个实例都将共享同一个数组。AFAIK 这是 Ember.js 中可接受的,甚至可能是常见的模式:

App.MyController = Ember.ArrayController.extend({
    content: null,
    init: function() {
        this._super();
        this.set('content', []);
    },
    // ...
});
于 2012-08-15T19:47:59.893 回答