1

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

我想要完成的是,在我打电话后,save如果返回的承诺得到解决,我想转换到一条路线。

这个 jsbin 中,您可以单击“新建”,输入一些内容,然后单击“创建”。转换发生,因此 promise fromsave被解决,但是我们创建的新模型由于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例如,假设用户单击Newthen Home。该模型仍然存在。如果用户再次单击New,则会创建一个新模型。现在我们有两个新模型。如果用户再次点击Homethen ,现在我们有三个模型。New如果输入了有效的输入并且用户最终单击Create,则有一个新的已保存模型和两个新的未保存模型仍在浮动。我认为甚至没有办法访问这些浮动模型了。

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

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

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

4

2 回答 2

3

我现在更好地理解了为什么要在“停用”时删除。我一直都知道最好不要使用 deactivate(例如在 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();
        }
      } 
    }
  }
});
于 2013-09-08T18:00:18.243 回答
0

看了你的代码。为什么您在 deactivate 中实施了“删除记录”?

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

if(!model.get('isSaving')) 表示如果你没有处于 isSaving 状态(这只发生在很短的时间内),那么删除记录...

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

马克

于 2013-09-08T17:01:36.767 回答