【问题标题】:Ember.js route hook to be called on every transition在每次转换时调用 Ember.js 路由挂钩
【发布时间】:2014-02-02 10:07:24
【问题描述】:

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

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

Example jsFiddle:当我第一次点击“测试”时,activate 钩子被调用,但当我第二次点击它时,它没有。

【问题讨论】:

  • var App = Ember.Application.create({LOG_TRANSITIONS: true }); ??
  • @kristjanreinhold 用于调试。

标签: ember.js


【解决方案1】:

您可以在路由器中设置 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/

更新:(旧链接已损坏,新链接已损坏) https://guides.emberjs.com/v1.10.0/cookbook/helpers_and_components/adding_google_analytics_tracking/

【讨论】:

【解决方案2】:

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

1 年后的今天,Ember 2.0 已经发布,别无他法 :(

Ember 不提供跟踪路由更改尝试的方法!这包括 URLattemts(history)、链接尝试、哈希更改尝试等。

【讨论】:

  • 它是开源的,所以请随时发布 PR。
【解决方案3】:

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/

【讨论】:

  • 这也不起作用。尝试连续两次点击相同的链接,您只会收到一个警报。
  • @imgx64 如果你点击同一个链接两次,你没有过渡......这有意义吗?如果您查看转换日志,您将看到“正在尝试转换到...”,然后什么也没有。
  • 但是,如果您在同一资源内的子路由和父路由之间转换,这将起作用,我认为这是您想要的。
  • 根据定义,“旧路由”和“新路由”必须不同,否则没有过渡。有点击,当然。如果您想要花哨的点击行为,请将其绑定到您的控制器。
  • 这发生在过渡之后。之前也会有帮助
【解决方案4】:

您是否已经考虑过钩子willTransition

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

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

【讨论】:

  • 不,新路由与旧路由相同时不会调用。
  • 那么你将不得不做一个 hack 并将任意值传递给你的转换,以便 Route 的模型发生变化。但是,当点击发生时实际上什么也没发生,您需要执行一些操作,这似乎真的很尴尬?
  • @mavilein activate 方法不会观察模型更改,因此这甚至无济于事。 :(
猜你喜欢
  • 2013-02-17
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2021-08-29
  • 2021-12-07
  • 2012-03-04
相关资源
最近更新 更多