2016-05-01 152 views
4

我使用的是角度ui路由器版本1.0.0-alpha.4,因爲默認情況下root作用域事件處於非活動狀態我想用如下實現auth機制的新方法。

.run(['$transitions', '$timeout', '$q', '$state', 'AuthService', ($transitions, $timeout, $q, $state, AuthService) => { 
    $transitions.onBefore({ to: 'app.*', from: '*' },() => { 
    const deferred = $q.defer(); 
    AuthService.isLoggedIn().then(() => { 
     deferred.resolve() 
    },() => { 
     // redirect to error page 
     // how can i redirect user to error page. $state.go('error') not working. 
     deferred.reject() 
    }); 
    return deferred.promise; 
    }, {priority: 10}); 
}]) 

但問題是,我不知道如何將用戶重定向到錯誤頁面。我嘗試使用$ state.go('錯誤'),似乎無法正常工作。有什麼建議麼?

+0

什麼是錯誤信息?你有沒有指定錯誤狀態的路由? –

+0

@DannyPranoto是的。我有,也沒有錯誤消息。我使用$ stateChangeStart完成了同樣的操作,默認情況下可以使用0.2.X版本,並且一切正常。 – fernando

+0

@fernando你知道我在哪裏可以找到關於v1.0.0-aplha的文檔嗎? – AjaxLeung

回答

3

酷我找到了解決方案。發佈給任何可能提出相同問題的人。你所需要的只是解決承諾如下。

deferred.resolve($state.target('error', undefined, { location: true })) 
2

它可能會更簡單,因爲身份驗證服務也承諾與承諾。

只需返回服務,不要創建另一個承諾。

如果您只是對消極情況感興趣,則會在收集階段返回狀態。

.run(['$transitions', '$state', 'AuthService', ($transitions, $state, AuthService) => { 
    $transitions.onBefore(
    { to: 'app.*', from: '*' }, 
    () => AuthService.isLoggedIn().catch(
     () => $state.target('error', undefined, { location: true }) 
    ), 
    {priority: 10} 
); 
}]) 
+0

謝謝你。文檔不完整! – CountZero

1

重定向從TransitionHook功能,你可以返回TargetState或解決了一個TargetState承諾的過渡。

從UI-路由器Docs

當從TransitionHookFn或TransitionStateHookFn返回,這些值改變運行過渡:
:過渡將被取消。
TargetState:轉換將被重定向到新的目標狀態。
承諾:過渡將等待承諾解決或拒絕。 (見下文)

  • 如果承諾被拒絕(或解析爲false),過渡將被取消
  • 如果承諾解析爲TargetState,過渡將被重定向
  • 如果承諾解析爲別的,過渡將恢復

別的:過渡將恢復