成功保存后转换到路由而不删除记录

时间:2013-09-08 16:37:53

标签: ember.js ember-data

Ember-1.0.0和带有Fixture Adapter的Ember Data 1.0 Beta 2.

我想要完成的是,在我致电save之后,如果已经解决了退回的承诺,我想转换到路线。

this 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应用程序中删除该模型。

2 个答案:

答案 0 :(得分:3)

我现在更清楚为什么要删除“停用”。我总是了解到最好不要使用停用(在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();
        }
      } 
    }
  }
});

答案 1 :(得分:0)

查看您的代码。为什么在停用时实现了“deleterecord”?

在每次路线更改时都会调用取消激活,并且您已在取消激活中实施删除,因此删除记录是正常的...

if(!model.get('isSaving'))表示如果您未处于isSaving状态(仅在非常短的时间内发生),则删除记录...

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

马克