【问题标题】:Computed property, array and addObject计算属性、数组和 addObject
【发布时间】:2013-06-27 09:59:47
【问题描述】:

我有一个计算属性,它从另一个属性构建一个数组并返回它。当我用addObject 更新这个数组时,set 显然没有被调用,所以我无法更新原始属性。有没有办法让我也更新 addObjectremoveObject 上的原始属性?

在这个例子中,我从一个逗号分隔值的字符串构建一个数组:

App.MyModel = DS.Model.extend({

    someAttribute: DS.attr('string'),

    computed: function(key, value) {
        var computedArray,
            someAttribute;

        // getter
        if (arguments.length === 1) {
            someAttribute = this.get('someAttribute');
            computedArray = description.split(',');
            return Ember.A(computedArray);
        }
        // setter
        else {
            someAttribute = value.join(',');
            this.set('someAttribute', someAttribute);
            return value;
        }
    }.property('someAttribute')

});

现在,如果我像这样更新我的计算属性,它会按预期工作:

>>> model.set('computed', ['turtles', 'all', 'the', 'way', 'down'])
['turtles', 'all', 'the', 'way', 'down']
>>> model.get('someAttribute')
"turtles,all,the,way,down"

但是现在如果我这样做,它们(预期)不同步:

>>> model.get('computed').addObject('oh yeah')
['turtles', 'all', 'the', 'way', 'down', 'oh yeah']
>>> model.get('someAttribute')
"turtles,all,the,way,down"

概括我的问题:当计算属性是可变的时,是否可以使计算属性与用于计算它的属性保持同步?如果没有,是否有针对数组的解决方法 (Ember.A())?

我是 Ember 的新手,可能有一些我还不知道的事情发生在幕后,但请赐教;)

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    这可能是设计使然,因为默认情况下计算的属性也会被缓存。因此,即使您设法使其正常工作,对此类属性的绑定也会有问题。

    尽管如此,设置一个辅助 observes 函数,然后监视计算的属性,您可能会有一些运气。您还需要使用固定数组来支持计算属性,这与您在每个 getter 上返回的新数组不同。

    除非它是关键的东西,否则我会避免违反 Ember 约定。

    “如果一旦你开始走上黑暗的道路,它将永远主宰你的命运” :)

    【讨论】:

    • 谢谢。如果您的 API 和客户端模型之间的差异太重要并且您无法控制它,我想 ember 不是最好的工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 2017-08-26
    相关资源
    最近更新 更多