在我的Ember应用程序中,我有两条路线,people
和person
。
当我转换为person时,当前模型的值绑定到应用程序控制器中的属性。
App.ApplicationController = Ember.Controller.extend({
needs: [ 'person' ],
currentPerson: Ember.computed('controllers.person.currentPerson', function () {
var person = this.get('controllers.person.currentPerson');
return person ? 'selected person #' + person.id : 'no one has been selected';
})
});
App.PersonController = Ember.Controller.extend({
currentPerson: Ember.computed.alias('model')
});
当我转出person
路线后,我想清除该值,理想情况下会破坏person
模型。
我试过了:
willTransition: function () {
this.get('model').destroy();
}
但这不起作用。如何正确删除缓存的路由模型?
示例:http://emberjs.jsbin.com/xogati/1/edit?html,js,output
谢谢!
答案 0 :(得分:2)
willTransition
挂钩应该有效。根据您拥有的代码,您可能会错误地使用它。 willTransition是路线上的活动,但您使用this.get('model')
并且路线上没有model
属性(它位于控制器上)。以下是您希望完成所需内容的完整代码。
App.PersonRoute = Ember.Route.extend({
actions: {
willTransition: function(transition) {
this.get('controller.model').destroy();
}
}
});
作为旁注,过渡时会有很多怪癖,并且当他们被解雇时(如果有的话)。如果您发现在某些情况下这对您不起作用,您可能需要查看deactivate挂钩。
答案 1 :(得分:0)
给任何偶然发现此事的人留下答案。
deactivate
事件允许创建一个将拆除模型的事件处理程序。对于这个特定的用例,我发现this.set('controller.model', null);
完成了这项工作,但假设你有一个更复杂的模型(即ember-data模型),你需要实现更多的逻辑。
destroyModel: function () {
this.set('controller.model', null);
}.on('deactivate')
示例:http://emberjs.jsbin.com/xogati/5/edit?html,js,output
感谢@GJK和@Artych。
答案 2 :(得分:0)
作为对未来读者的说明,目前首选的方法如下:
在您的路由文件中:
actions: {
willTransition() {
const modelRecord = this.controller.get('model');
// toss record changes (or the entire record itself) if it hasn't been saved
if (modelRecord.get('hasDirtyAttributes')) {
modelRecord.rollbackAttributes();
}
}
}
通常建议在willTransition
钩中执行此操作,因为如果仅在deactivate
钩中执行此操作并且您使用的是嵌套路由,则会遇到障碍