2013-01-07 36 views
4

我正嘗試遷移到Ember中的新路由器。用例如下:用戶未登錄但請求需要登錄的URL。他被重定向到登錄路徑,成功登錄後,他被重定向到他的原始目的地。如何在Ember的v2路由器中存儲路徑和轉換?

我通過覆蓋Router.route(路徑)和攔截路徑請求,當應用程序處於未授權狀態時,通過以前的路由器實現了此目的。

新的路由器沒有route()函數,我也不知道如何覆蓋它,現在路由器實例是由Ember自動創建的。無論如何,我可能不應該那樣做。

有一個看起來很有用的Route.redirect()鉤子。但是,Route不再在v2路由器中擴展Path,所以沒有Root.path,並且沒有路徑信息被傳入Route.redirect(),所以我不知道如何保存調用transitionTo()的路徑信息,後來。

我在下面提供了我的一般方法。我怎麼能做到這一點?它對於許多應用程序來說似乎是一個非常常見的用例。

// i imagine something like this should happen 
    App.AuthRequiredRoute = Ember.Route.extend({ 
     redirect: function() { 
      if(!App.controllerFor('login').get('isLoggedIn')) { 
        var pathToSave = ???? 
        App.controllerFor('login').set('pathAfterLogin',pathToSave); 
        this.transitionTo('login'); 
      } 
     } 
    } 
    // and then after login, the LoginController would call App.router.transitionTo(this.pathAfterLogin) 
+0

我應該補充說,在回答這個問題時,請記住動態段也需要支持。 – inconduit

+0

我正在嘗試使用與您一樣的新路由器進行與身份驗證相關的工作。我沒有你的答案,對不起:(但是,也許你會有一個對我來說呢?)http://stackoverflow.com/questions/14185040/how-to-re-render-application-template-with -new路由器 – Victor

回答

0

我已經在最後一兩天內對此進行了大量的研究。我可以和你分享我發現的情況以及一些想法。

首先,你可以針對當前路徑和環境,像這樣一些信息:

this.router.router.currentHandlerInfos 

這將返回數組。每個對象都有一個名稱和一個上下文屬性。這些名稱對應於您將在transitionTo中調用的路由器的名稱。

在我看來,雖然你可以用這樣的東西來工作,但這會很麻煩。 API文檔沒有提到這個,它可能不是有意將其用作公共API。

我也發現上述解決方案的問題也適用於更深的嵌套動態段。鑑於路由器v2的新功能,我認爲它會繼續發展,並且更好的解決方案可能會呈現出來。想要保存當前位置並在以後返回,這是相當普遍的事情。

與此同時,如果未在ApplicationController上設置已驗證的標誌,那麼可能在您的模板中使用條件塊來呈現登錄名而不是出口?我知道這不是「正確」,而是「現在」。