【发布时间】:2014-07-21 16:27:25
【问题描述】:
在编辑表单以仅在用户单击保存按钮并在用户取消操作时检索旧数据时才保存模型时有什么好的解决方案吗?
我见过一些解决方案,例如复制与每个表单字段数据绑定的对象,并在保存时将初始对象设置为复制的对象。
如果您可以在不使用 ember 数据的情况下给出答案,那就太好了。
【问题讨论】:
在编辑表单以仅在用户单击保存按钮并在用户取消操作时检索旧数据时才保存模型时有什么好的解决方案吗?
我见过一些解决方案,例如复制与每个表单字段数据绑定的对象,并在保存时将初始对象设置为复制的对象。
如果您可以在不使用 ember 数据的情况下给出答案,那就太好了。
【问题讨论】:
我知道您更喜欢不使用 ember-data 的解决方案,但我认为使用 ember-data 是最佳做法。这是一个使用 ember-data 的解决方案,因为我想很多人可能会遇到这个问题......
如果您按如下方式设置您的路线,它就会这样做。
App.CommentEditRoute = Em.Route.extend({
model: function(params) {
return this.store.find('comment', params.comment_id);
},
actions: {
willTransition: function(transition) {
var model = this.get('controller.content');
if (model.get('isDirty')) {
model.rollback();
}
}
},
});
如果您在控制器中调用this.get('content').save()(因为用户单击了保存按钮),它将通过适配器保持更改并且isDirty 将设置为false。因此,模型不会回滚。否则,如果您没有在控制器中调用this.get('content').save(),则isDirty 属性将为true,并且未保存的更改将被丢弃。请参阅DS.Model docs 了解更多信息。
willTransition 是路由即将改变时自动调用的事件 - 您不必直接调用它。
您的控制器可能如下所示:
App.CommentEditController = Em.ObjectController.extend({
save: function() {
var _this = this;
_this.get('content').save().then(function() {
// Success
_this.transitionToRoute('comments');
}, function() {
// Failure
Em.assert('Uh oh!');
});
},
cancel: function() {
this.transitionToRoute('comments');
},
});
此外,请务必使用默认的 HTML 表单提交,使用适当的 HTML 按钮或输入进行提交,以便您可以在视图中捕获提交事件,如下所示:
App.CommentEditView = Em.View.extend({
submit: function() {
this.get('controller').save();
},
});
【讨论】:
answers without using ember data