如何在Ember.js中销毁过渡路径模型

时间:2015-07-10 13:38:49

标签: javascript ember.js

在我的Ember应用程序中,我有两条路线,peopleperson

当我转换为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

谢谢!

3 个答案:

答案 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钩中执行此操作并且您使用的是嵌套路由,则会遇到障碍