在EmberJS 1.0.0-pre.4中检测路由转换

时间:2013-01-20 14:05:06

标签: ember.js ember-router

我正在尝试检测何时发生路由转换。我已将此代码段放在处理转换的最新版本的Ember(v1.0.0-pre.4)中:

  didTransition: function(infos) {
    // Don't do any further action here if we redirected
    if (infos[infos.length-1].handler.transitioned) { return; }

    var appController = this.container.lookup('controller:application'),
        path = routePath(infos);

    set(appController, 'currentPath', path);
    this.notifyPropertyChange('url');

    if (get(this, 'namespace').LOG_TRANSITIONS) {
      Ember.Logger.log("Transitioned into '" + path + "'");
    }
  },

我将我的Ember应用程序设置为window.App = Ember.Application.create()

我注意到它调用this.notifyPropertyChange('url');,但我尝试将观察者附加到我的应用App.RouterApp.Router.router,我收到错误,因为它没有实现Ember.Observable

如何在不为每条路线创建特殊的Ember.Route的情况下检测路线路径的变化?

1 个答案:

答案 0 :(得分:9)

更新的答案

您现在可以简单地在路由器的didTransition事件上绑定观察者:

App.Router.reopen({
  doSomethingOnUrlChange: function() {
    console.log(this.get('url'));
  }.on('didTransition')  
});

参见工作示例:http://jsfiddle.net/Sly7/3THD7/

以下是弃用的答案

在这里的片段中,有set(appController, 'currentPath', path);我认为你可以把观察者放在这个属性上。

我不知道您希望收到通知的确切位置,但可以在ApplicationController本身中执行此操作。

App.ApplicationController = Ember.Controller.extend({

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

请参阅此工作小提琴,例如:http://jsfiddle.net/qKrwU/