1

2 つのモデルが与えられた場合、「子」オブジェクトへの更新によって「親」オブジェクトが「ダーティ」としてマークsaveされ、親オブジェクトの呼び出しがスキップされないようにするにはどうすればよいでしょうか?


詳細

ember-model を使用して、次の ようなモデルを定義Personし ました。Address

    App.Person  = Ember.Model.extend({
        id: Ember.attr(),
        name: Ember.attr('string'),
        address: Ember.belongsTo('App.Address', { key: 'address', embedded: true }),
    });

    App.Address = Ember.Model.extend({
        id: Ember.attr(),
        line1: Ember.attr('string'),
        line2: Ember.attr('string')
    });

これをフォームにレンダリングし、これらの属性を編集可能にしました。

            {{input value=model.name classNames="name"}}
            {{input value=model.address.line1 classNames="address-line1"}}
            {{input value=model.address.line2 classNames="address-line2"}}
            <button type='button' {{action 'save'}}>Save</button>
            <button type='button' {{action 'cancel'}}>Cancel</button>

ここまでは順調ですね。パズルの最後のピースは、モデルをサーバーに永続化することです

    actions: {
        save: function() {
            var model = this.get('model');
            var address = model.get('address');
            console.log(
                "model.get('isDirty')=", model.get('isDirty'), //false
                "address.get('isDirty')=", address.get('isDirty') //true
            );
            model.save();
            model.get('address').save();
        },

        cancel: function() {
            var model = this.get('model');
            var address = model.get('address');
            console.log(
                "model.get('isDirty')=", model.get('isDirty'), //false
                "address.get('isDirty')=", address.get('isDirty') //true
            );
            address.revert();
            model.revert();
        }
    }

ここで、ユーザーがアドレス ( または のいずれline1line2) を編集すると、modelは「ダーティ」とは見なされないember-modelため、アダプタは を呼び出さないことがわかりますsave()

これは、がダーティであると見なされ、 で定義された関係を持っているaddress 場合modelでも発生します。

これは、2 つのオブジェクトで個別にsave(または) を呼び出す必要があることを意味します。revertしたがって、操作の原子性が失われ、addressオブジェクトの新しいエンドポイントも定義する必要があります。どちらもやりたくない。

address更新するとダーティmodelになることを確認するにはどうすればよいですか?


アップデート:

save「子」オブジェクトと「親」オブジェクトの両方を呼び出す代わりに、ember-model のソースを調べて、より良い方法を見つけました。

            console.log(
                "model.get('isDirty')=", model.get('isDirty'), //false
                "address.get('isDirty')=", address.get('isDirty') //true
            );
            // model.get('address').save();
            if (address.get('isDirty')) {
                model._relationshipBecameDirty('address');
            }
            console.log(
                "model.get('isDirty')=", model.get('isDirty'), //true
                "address.get('isDirty')=", address.get('isDirty') //true
            );
            model.save();

これにより原子性が保持されますが、このようにプライベート メソッドを直接呼び出すのは正しくないようです。より良い方法はありますか?

現在、このメソッドの唯一の使用法_relationshipBecameDirtyhas_many_array.jsember-model であり、. でインスタンスを見つけることができませんでしたbelongs_to.js。これがメンバーモデルの設計による意図的なものである場合、これを達成する適切な方法は何ですか?

4

1 に答える 1

0

まず、DS.hasOne('person')2 人が同じ住所を持っていない (そして、2 人の住所が同時に変わる) と仮定します。ID フィールドは必要ありません。それらは暗黙的です。

プライベート メソッドを呼び出す必要があります。これは、RESTful データベースでは意味がないためです。住所を変更するのはあなたであって、人ではありません!つまり、更新したい場合。Person の updated_at タイムスタンプ、アドレスが更新されたときにサーバー上でそれを行いたいと思うでしょう。person の属性はどれも変更されていないため、レコードが汚れていないと言う ember は正しいです。

新しい住所レコードを作成する場合は、最初に住所を保存してから、新しい ID を個人に設定し、次に個人を保存します (これはダーティになります)。その場合は、代わりに属している人物をアドレスに配置する方がよい場合があります。

于 2014-06-05T04:17:34.137 に答える