如何观察控制器/组件内数组的变化

时间:2013-12-09 18:40:44

标签: javascript ember.js

我们如何观察Ember中数组的变化?我有ember组件使用模型中的原始对象数据,但为了演示我在组件本身使用数组属性的问题,如:

 init:function(){
            this._super();
            var arr = Ember.A([
                Ember.Object.create({"shelfNo": 1, "noOfItems": 2}),
                Ember.Object.create({"shelfNo": 2, "noOfItems": 3}),
                Ember.Object.create({"shelfNo": 3, "noOfItems": 2})]
            );
            this.set("someArray",arr);

            //DOES NOT WORK

            this.get('someArray').addArrayObserver(function () {
                Ember.ObjectController.create({
                    arrayWillChange: function (observedObj, start, removeCount, addCount) {
                        console.log("in arrayWillChange");
                    },
                    arrayDidChange: function (array, start, removeCount, addCount) {
                        console.log("in arrayDidChange");
                    }
                });
            });

        }

我也尝试过:

testObserver: function(){
            //DOES NOT WORK
            console.log("here");
        }.observes('someArray@each')

但两件都不适合我!

这是一个jsbin:http://jsbin.com/EkumOjA/1/

谢谢, DEE

1 个答案:

答案 0 :(得分:6)

如果您正在观察数组中某个对象的属性,请使用someArray.@each.someProperty。要观察数组内容何时更改(someArray.pushObject,removeObject等),请使用someArray.[]someArray.length

此外,使用init而不是覆盖someFunc: function() {}.on('init')这是在对象初始化时让观察者工作的安全方法。

这是您更新的代码:

App.ShowQuestionComponent = Ember.Component.extend({
    someArray : null,
    initializeSomeArray:function(){                
        var arr = Ember.A([
            Ember.Object.create({"shelfNo": 1, "noOfItems": 2}),
            Ember.Object.create({"shelfNo": 2, "noOfItems": 3}),
            Ember.Object.create({"shelfNo": 3, "noOfItems": 2})]
        );              

        this.set("someArray",arr);
    }.on('init'), 
    testObserver: function(){                
        console.log("here");
    }.observes('someArray.[]')

});

您更新的jsbin http://jsbin.com/EkumOjA/2/edit