2014-02-28 37 views
2

是否有可能在應用程序中訂閱所有轉換事件?或者是一些包含當前路線的可觀察屬性?Ember.js全局路由/轉換事件

我正在與需要同步到當前路由的第三方UI組件集成。

回答

0

我掛接到Router.didTransition

活生生的例子解決了這個:http://jsbin.com/yuzedacu/5/edit(修改的例子中here

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); 
    } 
}); 
1

如解釋here所示,應用程序控制器具有currentRouteName屬性。它主要用於調試,但我認爲這是一個相當穩定的屬性,可用於生產。

編輯:如果你需要提醒所有的變化,使用hashchange event像Ember在內部。這隻會在你使用基於散列的路由時起作用。如果您使用Ember的基於歷史API的路由,您必須使用它。

+0

讓我接近但它只包括路徑的靜態部分,例如'users/fred'的'currentRouteName'是'users/user'。在動態路徑之間切換時,更改事件不會觸發。從'posts/1'轉換到'posts/2'。 – dwickern

+0

我更新了我的答案。 – GJK

0

在你app_controller您可以添加此代碼段時觸發每一路徑/路由變化

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

就像'currentRouteName'一樣,從'/ posts/1'改爲'/ posts/2'時不會觸發 – dwickern