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 状态(仅在很短的时间内发生),则删除记录...
我认为您可以删除完整的停用块。 然后它就会起作用。
马克