Ember.js全局路由/转换事件

Ember.js全局路由/转换事件,ember.js,Ember.js,是否可以订阅应用程序中的所有转换事件?或者包含当前路线的可观察属性 我正在与需要同步到当前路由的第三方UI组件集成。如前所述,应用程序控制器具有currentRouteName属性。它主要用于调试,但我认为它是一个相当稳定的属性,可以在生产中使用 编辑:如果您需要收到所有更改的警报,请使用与Ember内部相同的方法。但是,只有在使用基于散列的路由时,这才有效。如果您使用的是Ember基于历史API的路由,那么您必须使用它。在您的应用程序控制器中,您可以添加此代码段,它会在每次路径/路由更改时触发

是否可以订阅应用程序中的所有转换事件?或者包含当前路线的可观察属性


我正在与需要同步到当前路由的第三方UI组件集成。

如前所述,应用程序控制器具有
currentRouteName
属性。它主要用于调试,但我认为它是一个相当稳定的属性,可以在生产中使用


编辑:如果您需要收到所有更改的警报,请使用与Ember内部相同的方法。但是,只有在使用基于散列的路由时,这才有效。如果您使用的是Ember基于历史API的路由,那么您必须使用它。

在您的应用程序控制器中,您可以添加此代码段,它会在每次路径/路由更改时触发

currentPathDidChange: function currentPathDidChange() {
        var path = this.get('currentPath')
    }.observes('currentPath')

我通过连接到路由器解决了这个问题

实时示例:(修改了找到的示例)


这让我很接近,但它只包括路径的静态部分,例如
users/fred的
currentRouteName
users/user
。在动态路径之间切换时不会触发更改事件,例如从
posts/1
转换到
posts/2
。与
currentRouteName
一样,从
/posts/1
更改为
/posts/2
时不会触发更改事件
App.Router.reopen({
    updateCurrentRoute: function(infos) {
        var appController = this.container.lookup('controller:application');

        if (!('currentRoute' in appController)) {
            Ember.defineProperty(appController, 'currentRoute');
        }

        if (infos && infos.length > 0) {
            // The last part of the route contains the route name
            var route = infos[infos.length - 1].name;

            // Collect the dynamic route parameters
            var params = infos.reduce(function(a, b) {
                // Parameter can be named anything
                // assume there are 0 or 1 parameters
                for (var name in b.params) {
                    if (b.params.hasOwnProperty(name)) {
                        // 1 parameter
                        return a.concat(b.params[name]);
                    }
                }

                // 0 parameters
                return a;
            }, []);
            var path = [route].concat(params);
            Ember.set(appController, 'currentRoute', path);
        } else {
            Ember.set(appController, 'currentRoute', []);
        }
    },
    didTransition: function(infos) {
        this.updateCurrentRoute(infos);
        return this._super(infos);
    }
});