EmberJs:当belongsTo属性被弄脏时如何保存模型?

时间:2014-04-01 05:37:58

标签: javascript ember.js belongs-to ember-model

鉴于两种模式,我如何确保更新"孩子"对象标记"父母"反对"脏"这样在父对象上调用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 被视为&#34;脏&#34;,因此ember-model不会使适配器调用save()

即使address 被认为是脏的,并且其关系定义为model,也会发生这种情况。

这意味着我需要分别在两个对象上调用save(或revert)。因此,我将失去操作的原子性,还需要为address对象定义新的端点。我不想做其中任何一个。

如何确保更新address也会使model变得


更新

而不是在&#34;孩子&#34;上调用save。和父母&#34;对象,我通过查看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模型中的故意设计,那么实现这个目标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

首先,我包括DS.hasOne('person'),假设两个人没有相同的地址(并且他们的地址同时发生变化)。并且不需要ID字段,它们是隐含的。

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

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