在Ember中编辑记录而不更新UI

时间:2014-08-17 21:44:00

标签: ember.js ember-data

我正在使用Ember和Ember-Data而我正在尝试编辑记录。问题在于,由于输入是双向绑定到模型的,因此修改表单中的某些内容会立即改变整个应用程序中的模型(即使我不提交更改)。因此,即使它们没有存储,这些变化也反映在网站的任何地方。

在用户实际确认更改之前,在不修改记录的情况下编辑记录的Ember方式是什么?有没有办法克隆模型?

1 个答案:

答案 0 :(得分:3)

这真的很有趣,我只是遇到了这个问题,想出了一个解决方案,并在Calling myModel.save() Returning Outdated Model我自己的Stack Overflow问题中记录了这个问题。向下滚动到解决方案部分,第二个子弹。

我的看法是,这种模式虽然很常见,但在Ember社区中仍未得到很好的记录。例如,请参阅最近的这些讨论:

我通过以下方式解决了这个问题:

  • 挂钩您路线中的willTransition事件,以便每当您正在进行编辑的页面转出时,您就可以在此之前执行代码。请注意,这包括点击您的出路,或后退按钮输出。如果用户关闭了他们的浏览器,那么无论如何都会丢失这些更改,因此无需额外处理这种情况。
  • 现在在该钩子中,使用this.controller.get('model')获取您的模型,并使用isDirty查看this.controller.get('model').get('isDirty')的值。有关如何理解isDirty
  • 的讨论,请参阅http://emberjs.com/guides/models/working-with-records/
  • 如果isDirty为真,请按照http://emberjs.com/api/data/classes/DS.Model.html#method_rollback中的说明在您的模型上调用rollback()
  • 这将还原所有未保存的更改,以便您的应用的其余部分看起来一致。

我的模型orgUser与模型belongsTo的关系orgPerson。此关系设置为{ async: true }。回滚orgPerson关系对我来说就像这样:

Ember.Route.extend({
    actions: {
        willTransition: function( transition ) {
        this.controller.get('model.orgPerson').then( function( value ) {
            if ( value.get('isDirty') ) {
                value.rollback();
                }
            });
        },
    }
}

请注意,您(a)可能不需要像我一样将isDirty来电包裹在承诺中(例如,如果您不宣布{ async: true },并且(b)您可能只是如果您没有合作关系,请访问value.get('model')

另请注意,根据我的经验,myModel.rollback()不会回滚任何关系!这可能只是因为我在每个关系中使用{ async: true },但这绝对值得注意。

特别感谢@ kingpin2k在我原来的SO帖子上指出了正确的方向。