当save()失败时,防止ember更新模板

时间:2014-04-25 10:06:57

标签: ember.js ember-data

我在我的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版本)。

1 个答案:

答案 0 :(得分:2)

简单的解释是,当您的模型发生变化时,Ember会更新您的模板,并且您更改了模型。 Ember不知道或不关心你是否必须在真正生效之前在其他地方进行更改,它只知道你提供的数据。

如果您真的不想要这种行为,那么您必须以某种方式复制您的数据。这样您就可以更改模型数据,并且重复的数据不会发生变化,从而无法更新模板。

但我建议反对。我们大多数人都不关心模板是否立即更新,因为几乎所有的保存操作都应该成功。保存操作失败应该是非常罕见的情况。对我来说,我做了三件事让用户感到愉快:

  1. 尽可能多地在客户端进行验证。甚至不让他们发送服务器拒绝的数据,这只会浪费往返。

  2. 如果由于网络问题导致保存失败,请重试。第二次是魅力。

  3. 如果保存仍然没有成功,不会回滚他们所做的更改。提供错误消息,并让他们有机会稍后再试。

  4. 换句话说:没有内置功能来处理这些场景。您必须以对您的应用程序有意义的方式自己处理它们。