我正在使用Ember和Ember-Data而我正在尝试编辑记录。问题在于,由于输入是双向绑定到模型的,因此修改表单中的某些内容会立即改变整个应用程序中的模型(即使我不提交更改)。因此,即使它们没有存储,这些变化也反映在网站的任何地方。
在用户实际确认更改之前,在不修改记录的情况下编辑记录的Ember方式是什么?有没有办法克隆模型?
答案 0 :(得分:3)
这真的很有趣,我只是遇到了这个问题,想出了一个解决方案,并在Calling myModel.save() Returning Outdated Model我自己的Stack Overflow问题中记录了这个问题。向下滚动到解决方案部分,第二个子弹。
我的看法是,这种模式虽然很常见,但在Ember社区中仍未得到很好的记录。例如,请参阅最近的这些讨论:
我通过以下方式解决了这个问题:
willTransition
事件,以便每当您正在进行编辑的页面转出时,您就可以在此之前执行代码。请注意,这包括点击您的出路,或后退按钮输出。如果用户关闭了他们的浏览器,那么无论如何都会丢失这些更改,因此无需额外处理这种情况。this.controller.get('model')
获取您的模型,并使用isDirty
查看this.controller.get('model').get('isDirty')
的值。有关如何理解isDirty
。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帖子上指出了正确的方向。