2016-02-02 66 views
0

我有有canactivateangular2 CanActivate以http

import {isLoggedIn} from '../login/isLoginedIn'; 

@CanActivate((next, previous) => { 
isLoggedIn() 
})  

我 「isLoggedIn」 組件是如下

import {Http, Headers} from 'angular2/http'; 

class Auth { 
    constructor(@Inject(Http) private _http: Api) { } 

    check() { 
     this._http.get('/Users/LoggedInUser') 
    } 
} 

export const isLoggedIn =() => { 
    let injector = Injector.resolveAndCreate([Auth, Http]); 
    let auth = injector.get(Auth); 
    return auth.check(); 
}; 

我不能注入具有HTTP作爲扶養的服務。這可以這樣做,還是有更好的方法來做到這一點?

回答

2

由於CanActivate是一個裝飾而不是作爲與OnActivateCanDeactivate那麼你在假設你正在試圖授權部件的該構造函數依賴注入正確的方法不是一個選項。

您正在使用的方法可以正常工作,但您的Auth類中有一個錯過的@Injectable()

import {Injectable} from 'angular2/core'; 
import {Http, Headers} from 'angular2/http'; 

@Injectable() 
class Auth { 
    constructor(@Inject(Http) private _http: Api) { } 

    check() { 
     this._http.get('/Users/LoggedInUser') 
    } 
} 

這種做法是合理的,我不認爲除了一些語法糖或輕微的重構,將有很大改善這一點,仍然實現可讀性/可維護性相同數量的這種方法。

另外一個除了可能進行改善流動,並防止潛在的錯誤將返回觀察到在CanActivate使導航將等待Http請求,決定繼續或取消之前完成。

@CanActivate((next, previous) => { 
    return isLoggedIn() 
}) 

或短

@CanActivate(() => isLoggedIn()) 

(單語句箭頭功能是自動恢復)

+1

偉大的答案,但'CanActivate'是一個裝飾(而不是指令),不是嗎? ;-) –

+0

有無論如何設置具有@CanActivate的組件的屬性?說isLoggedIn也會返回用戶,你想把它扔在組件上? – Primm

+0

@ThierryTemplier你是完全正確的,我霧已經累了昨晚。將更新措辭。感謝您接受這一點。 – SnareChops