Ember.js - 在Object中定义ArrayProxy

时间:2012-06-01 11:30:04

标签: javascript ember.js

我有一个类别列表。每个类别都可以有子类别。 这是我创建的模型:

App.Category = Em.Object.extend({
    id: null,
    name: null,
    subCategories: Em.ArrayProxy.create({content: []})
});

问题是,如果我将子类别推入subCategories数组,它将被推送到App.Category的每个实例

看看这个jsFiddle

我不明白为什么会发生这种情况,我应该如何重写它才能正常工作。


代码

App.Category = Em.Object.extend({
    id: null,
    name: null,
    subCategories: Em.ArrayProxy.create({content: []})
});

App.categories = Em.ArrayController.create({
    content: [],

    // assumes list of categories is ordered by parent id
    loadCategories: function(cats) {
        for (var i=0, cat; i < cats.length; i++) {
            var parentID = cats[i].parentID;
            delete cats[i].parentID;
            cat = App.Category.create(cats[i]);

            if (parentID !== null) {
                var parent = this.findProperty('id', parentID);
                parent.get('subCategories').pushObject(cat);
            } else {
                this.pushObject(cat);
            }
        };
    }
});

1 个答案:

答案 0 :(得分:2)

这是因为传递给extend的哈希定义了由类实例化的对象原型的属性。而create定义实例化对象的属性。 Dan Gebhardt撰写了一篇关于Understanding Ember.js Object的非常好的博客文章。你应该看看它。

您的问题可以通过以下方式解决,请参阅http://jsfiddle.net/pangratz666/hXHqs/

App.Category = Em.Object.extend({
    init: function() {
        this._super();
        this.set('subCategories', Em.ArrayProxy.create({
            content: []
        }));
    }
});