【问题标题】:how to observe changes in an array within controller/component如何观察控制器/组件中数组的变化
【发布时间】:2013-12-09 18:40:43
【问题描述】:

我们如何在 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/

谢谢, 深

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    如果您正在观察数组中某个对象的属性,请使用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

    【讨论】:

    • 感谢 Marcio,我意识到我错过了什么。我应该做 .observes('someArray.@each') 而不是 .observes('someArray@each') - 我错过了“。”。没有您的 jsbin,我将无法解决我的问题。谢谢。
    • 不客气。请记住,如果您想观察内容更改,只需使用someArray.[],因为someArray.@each 旨在观察数组中的属性,它在每个项目中添加侦听器,因此您只需使用someArray.[] 即可获得性能。跨度>
    猜你喜欢
    • 2011-07-03
    • 2020-02-12
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2017-11-16
    相关资源
    最近更新 更多