1

给定两个模型,我如何确保对“子”对象的更新将“父”对象标记为“脏”,以便save对父对象的调用不会跳过?


细节

使用 ember-model,我定义 PersonAddress如下模型:

    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

这意味着我需要在两个对象上分别调用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();

这确保了原子性得以保留,但是像这样直接调用私有方法似乎并不正确。有没有更好的办法?

目前这种方法的唯一用途_relationshipBecameDirty——has_many_array.js在 ember-model 中,我无法在belongs_to.js. 如果这是在 meber 模型中有意设计的,那么实现此目的的正确方法是什么?

4

1 回答 1

0

首先,我DS.hasOne('person')假设两个人没有相同的地址(并且他们的地址同时更改)。并且不需要 ID 字段,它们是隐式的。

您必须调用私有方法,因为您所做的对 RESTful 数据库没有意义。您更改地址,而不是人!如果你想更新即。在 Person 上的 updated_at 时间戳,您希望在地址更新时在服务器上执行此操作。person 的所有属性都没有改变,所以 ember 说记录不脏是对的。

如果您正在创建新的地址记录,您需要先保存地址,然后将新 ID 设置为人员,然后保存人员(这将是脏的)。在这种情况下,您最好将 belongsTo 人放在地址上。

于 2014-06-05T04:17:34.137 回答