2

別の属性から配列を作成して返す計算されたプロパティがあります。この配列を で更新するとaddObjectset明らかに呼び出されないため、元の属性を更新できません。またはの元の属性も更新する方法はあります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 を初めて使用し、内部でまだ知らないことが起こっている可能性がありますが、教えてください ;)

4

1 に答える 1

2

計算されたプロパティもデフォルトでキャッシュされるため、これはおそらく設計によるものです。したがって、これを機能させることができたとしても、そのようなプロパティに対するバインドは問題になります。

observesそれにもかかわらず、計算されたプロパティを監視する二次関数を設定することで、運が良いかもしれません。また、各ゲッターで返す新しい配列とは異なり、計算されたプロパティを固定配列でバックアップする必要があります。

それが何か重大なことでない限り、私は Ember の慣例に反することは避けます。

「一度暗い道を歩み始めると、永遠にそれがあなたの運命を支配するでしょう」 :)

于 2013-06-27T14:19:42.373 に答える