Saya memiliki AuthGuard (digunakan untuk perutean) yang mengimplementasikan CanActivate .
canActivate() {
return this.loginService.isLoggedIn();
}
Masalah saya adalah, bahwa CanActivate-result bergantung pada http-get-result - LoginService mengembalikan sebuah Observable .
isLoggedIn():Observable<boolean> {
return this.http.get(ApiResources.LOGON).map(response => response.ok);
}
Bagaimana cara menyatukannya - membuat CanActivate bergantung pada status backend?
# # # # # #
EDIT: Harap dicatat, bahwa pertanyaan ini dari 2016 - tahap awal sudut / router telah digunakan.
# # # # # #
angular
angular2-routing
angular2-http
Philipp
sumber
sumber
canActivate()
dapat mengembalikanObservable
, pastikan saja bahwaObservable
telah selesai (mis.observer.complete()
).take(1)
operator Rx untuk mencapai kelengkapan streaming, Bagaimana jika saya lupa menambahkannya?Jawaban:
Anda harus meningkatkan "@ angular / router" ke yang terbaru. misalnya "3.0.0-alpha.8"
modifikasi AuthGuard.ts
Jika Anda memiliki pertanyaan, tanyakan kepada saya!
sumber
isLoggedIn()
adalahPromise
, Anda bisa melakukanisLoggedIn().then((e) => { if (e) { return true; } }).catch(() => { return false; });
Semoga ini membantu pelancong masa depan!import 'rxjs/add/observable/of';
Memperbarui jawaban Kery Hu untuk Angular 5 dan RxJS 5.5 di mana
catch
operator tidak digunakan lagi. Sekarang Anda harus menggunakan operator catchError bersama dengan operator pipa dan lettable .import { Injectable } from '@angular/core'; import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs/Observable'; import { catchError, map} from 'rxjs/operators'; import { of } from 'rxjs/observable/of'; @Injectable() export class AuthGuard implements CanActivate { constructor(private loginService: LoginService, private router: Router) { } canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { return this.loginService.isLoggedIn().pipe( map(e => { if (e) { return true; } else { ... } }), catchError((err) => { this.router.navigate(['/login']); return of(false); }) ); } }
sumber
canActivate () menerima
Observable<boolean>
sebagai nilai yang dikembalikan. Penjaga akan menunggu Observable untuk menyelesaikan dan melihat nilainya. Jika 'benar' itu akan lolos pemeriksaan, yang lain (data lain atau kesalahan yang dilemparkan) akan menolak rute.Anda dapat menggunakan
.map
operator untuk mengubahObservable<Response>
menjadiObservable<boolean>
seperti ini:sumber
Saya telah melakukannya dengan cara ini:
Seperti yang Anda lihat, saya mengirimkan fungsi fallback ke userService.auth apa yang harus dilakukan jika panggilan http gagal.
Dan di userService saya punya:
sumber
Ini dapat membantu Anda
sumber
CanActivate berfungsi dengan Observable tetapi gagal ketika 2 panggilan dilakukan seperti CanActivate: [Guard1, Guard2].
Di sini jika Anda mengembalikan Observable of false dari Guard1, maka itu juga akan memeriksa di Guard2 dan mengizinkan akses ke rute jika Guard2 mengembalikan true. Untuk menghindarinya, Guard1 harus menampilkan boolean, bukan Observable of boolean.
sumber
di canActivate (), Anda bisa mengembalikan properti boolean lokal (defaultnya ke false dalam kasus Anda).
Dan kemudian pada hasil LoginService, Anda bisa mengubah nilai properti itu.
sumber