成功保存后过渡到路由,而不删除记录



Ember-1.0.0 和 Ember Data 1.0 Beta 2 带夹具适配器。

试图实现的是,在我调用save后,如果返回的承诺得到解决,我想过渡到路由。

在此jsbin中,您可以单击"新建",输入内容,然后单击"创建"。转换发生,因此save的承诺被解析,但随后我们创建的新模型由于deactivate钩子而被删除。

顺便说一句,在数据窗口上打开 chrome ember 检查器可能会有所帮助。

不过,我的实现显然是错误的。我应该如何保存记录,然后等待承诺解决,然后再过渡到路由而不删除新创建的记录?

以下是保存操作:

save: function() {
  var self = this;
  self.modelFor('thingsNew').save().then(function() {
    self.transitionTo('things');
  });
}

和停用钩子:

deactivate: function() {
  var model = this.modelFor('thingsNew');
  if(!model.get('isSaving')) {
    model.deleteRecord();
  }
}

有关其他所有内容,请参阅 jsbin。

deactivate的原因是,当用户单击另一个链接或在单击创建按钮之前按后退按钮时,thingsNew中的模型将被正确删除。例如,假设用户单击New然后Home。该模型仍然存在。如果用户再次单击"New",则会创建一个新模型。现在我们有两个新模型。如果用户点击Home然后再次New,现在我们有三种模型。如果输入了有效的输入并且用户最终单击Create,则有一个新的已保存模型和两个新的未保存模型仍然浮动。我认为甚至没有办法再访问这些浮动模型了。

最后,如果我只调用这两个方法,那么模型将调用save然后转换而不删除模型,但无论承诺是解决还是拒绝,它都会这样做。

model.save();
model.transitionTo('things');

只是要注意,这似乎也发生在RESTAdapter上。记录已在服务器上成功创建,但在转换期间,模型仍会在 Ember 应用中删除。

我现在更好地理解了为什么要在"停用"时删除。 我一直认为最好不要使用deactive(在例如xxx/edit/1和xxx/edit/2之间切换时不会触发)。

你可以更好地使用 willTransition。 这是我使用的代码:

App.AuthorsNewRoute = Ember.Route.extend({
  model: function() {
    return this.store.createRecord('author');
  },
  actions: {
    willTransition: function(transition) {
      var model = this.get('currentModel');
      if (model && model.get('isDirty')) {
        if (confirm("You have unsaved changes. Click OK to stay on the current page. Click cancel to discard these changes and move to the requested page.")) {
          //Stay on same page and continue editing
          transition.abort();
        } else {
          //Delete created record
          var author = this.get('currentModel');
          author.deleteRecord();
        }
      } 
    }
  }
});

查看了您的代码。 为什么要在停用中实施"删除记录"?

每次路由更改时都会调用停用,并且您已在停用中实现了删除,因此删除记录是正常的......

if(!model.get('isSaving')) 意味着如果您不处于 isSaving 状态(仅在很短的时间内发生),则删除记录...

我认为您可以删除完整的停用块。 然后它就会起作用。

马克

最新更新