我在我的API之上构建了一个Ember应用程序并且想知道,为什么Ember会更新我的模板,即使由于记录无效而导致保存失败(例如,当API返回422时):
data.set('name', 'some_invalid_stuff');
data.save().then(function() {
// close modal
_this.closeForm();
// disable editing mode
_this.set('isEditing', false);
}, function (response) {
_this.set('errors', response.errors);
data.rollback();
});
当我注释掉data.rollback();
时,模板会使用无效记录进行更新,因为API不接受某些值。 data.rollback();
的问题是一些奇怪的闪烁:首先,记录在模板上更新,但几毫秒之后,rollback
将触发并使用旧数据更新模板。
特别是如果列表按字母顺序排序,这个"双重更新"非常烦人。
当save()
失败时,有没有办法阻止模板更新?
事实上,模板会在data.set('name', 'some_invalid_stuff');
之后立即更新。
我使用最新稳定的Ember版本(1.5.1)和最新的Canary版本的Ember-Data(但也尝试了最新的Beta版本)。
答案 0 :(得分:2)
简单的解释是,当您的模型发生变化时,Ember会更新您的模板,并且您更改了模型。 Ember不知道或不关心你是否必须在真正生效之前在其他地方进行更改,它只知道你提供的数据。
如果您真的不想要这种行为,那么您必须以某种方式复制您的数据。这样您就可以更改模型数据,并且重复的数据不会发生变化,从而无法更新模板。
但我建议反对。我们大多数人都不关心模板是否立即更新,因为几乎所有的保存操作都应该成功。保存操作失败应该是非常罕见的情况。对我来说,我做了三件事让用户感到愉快:
尽可能多地在客户端进行验证。甚至不让他们发送服务器拒绝的数据,这只会浪费往返。
如果由于网络问题导致保存失败,请重试。第二次是魅力。
如果保存仍然没有成功,不会回滚他们所做的更改。提供错误消息,并让他们有机会稍后再试。
换句话说:没有内置功能来处理这些场景。您必须以对您的应用程序有意义的方式自己处理它们。