2017-04-05 10 views
3

私はisLoggedIn()のサービスを呼び出し、約束を返して解決し、そのルートは適切に処理されるcanActivate()という働きをしている働くangular2ガードを持っています。約束の結果をガードで否定する

しかし、私は逆の作業をしようとしています。ユーザーがログインしていないときに表示され、動作していない場合を参照してください。

私はそれが仕事と期待して、このような単純なもの(オペレータの追加を!)試してみました:

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private authService: AuthService) {} 

    canActivate() { 
     return !this.authService.isLoggedIn(); 
    } 
} 

しかし、これは常にfalsey値を返し、ルートがアクティブにすることはありません。ユーザーは、その後、彼がログインしているnullに等しくないと約束が真で解決する場合

isLoggedIn(): Promise<Boolean> { 
    var component = this; 
    return new Promise((resolve, reject) => {  
     component.queryForUser((user) => { 
     resolve(user != null); 
     }); 
    } 
    }); 
} 

は、これは私のisLoggedIn()機能の関連抜粋です。それ以外は偽です。

私は単純に、私が探している状態を指定するためのパラメータを追加することもできますが、同じロジックを持ちながら反転したisNotLoggedIn()関数を作成することもできますが、約束の解決の価値を否定する方法はありますか? canActivate()

+0

約束どおりの約束をしてください。 '.then(...)' –

答えて

6

return !this.authService.isLoggedIn()は理由JSがどのように動作するかの、動作しません。 this.authService.isLoggedIn()は有望なオブジェクトであり、真実です。 !this.authService.isLoggedIn()は常にfalseになります。

代わりに、約束の結果は

canActivate() { 
    return this.authService.isLoggedIn().then(result => !result); 
} 

それとも

async canActivate() { 
    return !(await this.authService.isLoggedIn()); 
} 

で否定結果にマッピングする必要がありawait ...周りの括弧はオプションであり、読みやすくするために使用されています。

+0

私はTypeScriptが初めてです。これまでは、 '(a)=>(sth(a))'の '=>'演算子を 'function(a){sth(a)} 'の省略形として使用しました。この場合、 '=>'とは何ですか?それはちょうど同じものですか? –

+1

厳密に言えば、それは '関数(a){戻りsth(a)}'です。暗黙の帰りは常に物事を台無しにする可能性があるので、心に留めておくべきです。はい、これは1つのパラメータの短縮形です。それを使用するかどうかは味の問題です。私は個人的にはそれが矛盾しているので自分のスタイルガイドでは使用しません(不一致は特にここで議論されていますhttp://stackoverflow.com/a/41086381/3731501)。 – estus

3

あなたがする必要があるのは、約束の解決された値のさらにいくつかの操作である:

canActivate() { 
    return this.authService.isLoggedIn().then(loggedIn => !loggedIn); 
}