angular.io numaralı örnekten ilham aldı (Ebeveynler ve çocuklar bir hizmet aracılığıyla iletişim kurar) Ben kullanıcının kimliği doğrulanmış gezinme bileşenimi bildirmek için bir gözlemci/gözlenebilir model uygulardım. Sorun, navigasyon bileşeninin sadece kullanıcı oturumu kapattığı zaman bir bildirim almasıdır. Her iki aramalar (giriş ve çıkış) yapılır ve hata özel durum dikkat ettikGözlemci sadece bir sonraki çağrıdan değer alır
export class AuthenticationService {
private isAuthenticatedSource = new Subject<boolean>();
isAuthenticated$ = this.isAuthenticatedSource.asObservable();
constructor(private http : AuthHttp) {}
login(email: string, password: string) {
...
this.isAuthenticatedSource.next(true);
...
}
logout() {
...
this.isAuthenticatedSource.next(false);
...
}
}
: gibi
Benim kimlik doğrulama hizmeti görünüyor. giriş ve "olarak güncellendi: false" zaman dışarı oturum açarken:
export class NavigationComponent implements OnDestroy, OnInit {
private subscription: Subscription;
isAuthenticated: boolean;
constructor(private authService: AuthenticationService,
private router: Router) {
this.isAuthenticated = authService.isAuthenticated();
}
logout(event) {
event.preventDefault();
this.authService.logout();
this.router.navigate(["Authentication", "Login"]);
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
ngOnInit() {
this.subscription = this.authService.isAuthenticated$.subscribe(
value => console.log("updated to:", value)
);
}
}
konsol log "true Güncelleme" olmalıdır: Benim navigasyon bileşeni gibi görünüyor. Sorun, sadece çıkış yaparken bir mesaj göstermesidir. Açıkça gözlemci giriş yaparken değeri (doğru) almaz. Umarım bunun neden olduğunu açıklamanıza yardımcı olabilirsiniz.
Güncelleme
giriş çağrı şimdi aşağıda bulunmaktadır. Bir kullanıcı (giriş) formu gönderdiğinde benim LoginComponent
den denir.
export class LoginComponent {
public email : string;
public password : string;
public errors : any;
public next : any;
constructor(private authService : AuthenticationService,
private router : Router,
private params : RouteParams) {
// default to navigate to dashboard on successfull login
let next = this.params.get("next") || "/Dashboard";
this.next = [next];
}
login(event) {
event.preventDefault();
this.authService.login(this.email, this.password)
.subscribe(
data => this.router.navigate(this.next),
errors => this.errors = errors);
}
}
karşılık gelen şablon giriş tek bir çağrı vardır: gibi LoginComponent
görünüyor <form (submit)="login($event)">
. Giriş, uygulamada başka yerlerde aranmaz.
Kurucuda önceden abone olabilirsiniz, kodun güncellenmekte olan girişlere bağlı olmaması durumunda 'ngOnInit()' için beklemenize gerek yoktur. Belki de olay zaten "NavigationComponent" abonesi olmadan gönderilmiştir. Abone olduktan hemen sonra son değeri almak için bir 'BehaviorSubject' gerekir. –
Kodunuzda 'login' çağrısını görmüyorum - konuya abone olduğunuz _after_ 'ı çağırdığınızdan emin misiniz? Bir konu sadece abonelikten sonra abonelere gönderecektir - muhtemelen farklı bir Konu türü, belki de 'BehaviorSubject' – tddmonkey
Geri bildirim için teşekkürler. Denenmiş DavranışSubject ve hiçbir şey değişmedi. Ayrıca abone çağrısını yapıcıya taşıyacağım, ancak durum hala aynı. @tddmonkey Evet Eminim. Bir kullanıcı bir düğmeye bastığında oturum açma işlemi çağrılır - Gezinme Bileşeninin konuya abone olmasından sonra. – ThaBird