4

我正在使用基于 EmberJS 构建的 Discourse ( http://www.discourse.org/ ),并尝试观察 URL 更改的任何时间,例如打开新主题时。我已经看到了观察 currentPath 的答案,例如这里: Detect route transitions in EmberJS 1.0.0-pre.4

App.ApplicationController = Ember.Controller.extend({

  routeChanged: function(){
    // the currentPath has changed;
  }.observes('currentPath');
});

但我正在尝试检测任何URL 更改,而不仅仅是路径更改。如该答案的评论中所述:

/pages/1这个观察者在从例如转换到时不会触发 ,/pages/2因为路径保持不变: pages.page.index

我想做的实际上是检测前面提到的那些不会被observes('currentPath'). 沿着这些思路,如果我this.get('currentPath');在我的函数内部做,我会得到类似的东西,topic.fromParams但我实际上对 URL 路径感兴趣,例如/t/this-is-my-url-slug.

简而言之,我想检测应用程序何时来自:

/t/this-is-my-url-slug

/t/another-url-slug

能够捕获路径:/t/another-url-slug

抱歉,我有点像 Ember n00b,我唯一的经验是通过 Discourse。有任何想法吗?

4

3 回答 3

7

您不需要任何特定于 Ember 的东西来执行此操作。根据您使用的是 hash 还是 pushstate,您可以使用...

$(window).on('hashchange', function(){
  console.log("Hash URL is " + location.hash.substr(1));
  // Do stuff
});

或者

$(window).on('popstate', function(e) {
  console.log("Hash URL is " + window.location.pathname);
  // Do stuff
});
于 2013-05-16T04:23:14.750 回答
3

该解决方案非常特定于 Discourse(而不像 EmberJS 那样通用),但 Discourse 有一个 URL 命名空间,用于 URL 相关函数(/components/url.js)。routeTo(path)每次加载新路由时都会调用一个函数。所以我能够在其中添加我自己的函数,以确保:

  • 每次话语路线更改时都会调用我的函数
  • 我可以捕获它path本身(即 URL)
于 2013-05-16T18:56:06.883 回答
0

使用 Luke Melia 的回答,您没有进行任何拆卸以防止内存泄漏,而不会在使用浏览器后退按钮时引起问题。

如果您的应用程序全局需要这样做,并且您只想使用此事件来调用一个函数,那么可以。但是,如果您想在离开路线时调用 off() (当您不需要它时应该将其拆除),您将导致 ember 出现错误。特别是在尝试使用浏览器的后退按钮时。

更好的方法是利用事件总线并将事件代理到不会导致后退按钮出现问题的事件。

    $(window).on('hashchange', function(){ 
        //Light weight, just a trigger
        $(window).trigger('yourCustomEventName');
    });

然后,当您想收听哈希更改时,请收听您的自定义事件,然后在不需要时将其拆除。

输入路线 A:

    $(window).on('yourCustomEventName', function(){ 
        // Do the heavy lifting
        functionforA();
    });

离开路线A:

    $(window).off('yourCustomEventName');

进入路线 B:

    $(window).on('yourCustomEventName', function(){ 
        // Do the heavy lifting maybe it's different?
        functionforB();
    });

离开路线B:

    $(window).off('yourCustomEventName');
于 2014-02-19T01:22:27.147 回答