2014-10-07 60 views
1

我試圖使用規則函數來設置.otherwise()以確定默認URL。我不能注入狀態或讀取路徑,因爲應用程序尚未加載,我真正需要做的是類似於在.otherwise()中解析的內容,以檢查我的UserService併爲會話ping服務器,因爲我的UserService.isLoggedIn是未定義的。你如何處理有不同的默認網址,你真的需要解決的東西?如何在.otherwise()上確定默認URL,但沒有可用的解決方案

+0

您可以分享場景的示例代碼以幫助更好地理解問題嗎? – 2014-10-07 04:26:26

回答

2

看一看的示例在官方文檔中:$ urlRouterProvider#methods_otherwise

// Example of using function rule as param 
    $urlRouterProvider.otherwise(function ($injector, $location) { 
    return '/a/valid/url'; 
    }); 

你有$injector$location,這樣你就可以竊取任何你需要的東西。如果需要,您甚至可以將其包裝在易於閱讀的注射功能中:

function myOtherwiseFunction($state, UserService, Whatever) { 
    // check some $state stuff 
    if ($state.current) { /* blah */ } 
    // check some Whatever stuff 
    if (Whatever.myFancyLogic()) { /* blah */ } 

    if (UserService.isLoggedIn()) 
    return "/app"; 
    else 
    return "/login"; 
} 

$urlRouterProvider.otherwise(function ($injector, $location) { 
    return $injector.invoke(myOtherwiseFunction); 
}); 
+0

假設UserService需要首先運行一個$ http請求,以確保在路由.otherwise()一個承諾成功履行,這不會在你的例子中短缺,因爲它會被執行異步,而不是使用類似的東西在儀表板或登錄之間進行路由之前,resolve()可以保證promise如果已完成並且成功。 – mtpultz 2014-10-09 17:26:54

+1

正確。其他方面是同步的。 – 2014-10-09 18:18:45

+0

我不知道。其他方面是同步的,所以我可以像解析一樣對待它並返回一個承諾?非常感謝,很高興知道。 – mtpultz 2014-10-09 18:28:21

0

你可以調用你的函數isLogged in your otherwise function。

但事實是,你不能注入你的服務UserService在你的配置功能(我想有點),因爲它不是一個常量既不是提供者。

你可以做什麼在呼喚您在返回類似的決心功能的承諾恆定的記錄過程:

.constant('login', function(){ 

    var access = function(UserService){ 
    return $q.when('start').then(function(){ 
     return UserService.initSession(); // I suppose you have a similar function 
    }) 
    } 

    access.$inject = ['UserService']; 

    return access; 
}) 

而且在你的配置功能:

.config([..., 'login', 
... 
$urlRouterProvider.otherwise(function() { 
    login(); 
    ... 
相關問題