Ember js - 激活路线时如何触发控制器动作

时间:2016-06-14 22:36:32

标签: javascript ember.js

每次控制器转换到('建模器'路线)时,我都需要触发控制器动作,但我似乎无法使其正常工作。我的router.js文件是:

var Router = Ember.Router.extend({
  location: config.locationType,
  actions: {
    loading: function() {
        this.controllerFor('modeller').send('loading');
    },
    didTransition: function() {
        this.controllerFor('modeller').send('didTransition');
    }
  }
});

Router.map(function() {
  this.route('modeller', { path: 'modeller'});
  this.route('welcome', { path: '/'});
});
export default Router;

我的建模师控制器:

export default Ember.Controller.extend({
  needs: 'modeller',

  loading: function () {
    console.log("loading")
  },

  didTransition: function () {
    console.log("didTransition")
  },
});

但我无法通过任何这些操作登录到控制台。任何指针都非常感激。

更新

可能应该提到我使用的是Ember 2.1.0!

所以我使用的解决方案是setupController - 但我还需要将它放到app / routes / modeller.js下的特定建模器路径文件中。以前我试图在app / router.js中做所有事情而且它没有在那里工作。所以最终的解决方案是:

# app/routes/modeller.js
import Ember from 'ember';
export default Ember.Route.extend({

  setupController: function(controller, model) {
    this.controllerFor('modeller').activate();
  }
});

和..

 # app/controllers/modeller.js
 export default Ember.Controller.extend({
   needs: 'modeller',

   activate: function () {
     console.log("activate")
   },
 });

2 个答案:

答案 0 :(得分:2)

didTransitionRoute上的方法,而不是Controller上的方法,这就是为什么不调用该方法的原因。

如果你需要从路线中实现控制器,那么你想要的钩子就是setupController

最佳做法是使用components,这样您就可以使用组件lifecycle hooks

答案 1 :(得分:1)

尝试在路线中使用willTransition。

尝试转换时,无论是通过{{link-to}},transitionTo还是更改URL,都会对当前活动的路由触发willTransition操作。这给出了每条活动路线,从最多叶的路线开始,有机会决定是否应该进行过渡。

https://guides.emberjs.com/v2.4.0/routing/preventing-and-retrying-transitions/

模型挂钩

激活&停用Ember.Route的钩子也会在路线之间的每个过渡时被调用,这两个中的任何一个也可以使用和里面 你可以调用控制器动作方法。

deactivate: function() {
    this._super();
     this.get('controller').send('actionName');
}