每次转换时都会调用Ember.js路由挂钩

时间:2014-01-14 11:07:32

标签: ember.js

Ember.js中是否存在在每次转换时调用的路由挂钩,即使新路由与旧路由相同(例如,单击指向同一路径的顶级导航链接)。

我尝试了activate,但它只被调用了一次,当我使用顶级导航转到我已经使用的相同路线时,它没有被再次调用。

Example jsFiddle:当我第一次点击“测试”时,会调用activate挂钩,但是当我第二次点击它时,它不会。

4 个答案:

答案 0 :(得分:11)

您可以在路由器中设置didTransition,这正是Ember为Google Analytics设置的方式。

App.Router.reopen({
 doSomething: function() {
    // do something here
    return;
  }.on('didTransition')
});

请参阅此处的示例:http://emberjs.com/guides/cookbook/helpers_and_components/adding_google_analytics_tracking/

答案 1 :(得分:6)

Activate未被第二次调用,因为This hook is executed when the router enters the route...当您再次点击该链接时,路由器没有做任何事情......如同,没有转换是正在制作(虽然它是“尝试”)。

http://emberjs.com/api/classes/Ember.Route.html#method_activate

我发现最有效的方法是从控制器中观察currentPath。我将它用于路线之间的动画。

在您的应用程序控制器中,您可以执行以下操作:

currentPathChange: function () {
  switch(this.get('currentPath')){
    case 'test.index':
      this.doSomething();
      break;
    case 'test.new':
      this.doSomethingElse();
      break;
  }
}.observes('currentPath')

你应该能够从应用程序控制器访问你的应用程序的几乎任何部分,所以这是一个很好的“根钩”,我想。

示例:http://jsfiddle.net/mattblancarte/jxWjh/2/

答案 2 :(得分:5)

你有没有考虑过willTransition

http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

App.SomeRoute = Ember.Route.extend({
  actions: {
    willTransition: function(transition) {
      // do your stuff
    }
  }
});

答案 3 :(得分:2)

更改/破解EmberJS代码并在doTransition()函数中添加jQuery事件触发器。这是最好的,但有点打败了这一点。

截至今天,1年后,Ember 2.0出现了,没有其他方式:(

Ember没有提供跟踪路线改变尝试的方法!这包括URLattemts(历史记录),链接到尝试,哈希更改尝试等。