typescript - Angular2 - Servis değişkeni değişikliklerine abone olma
Authenticated değişkenini doğru veya yanlış yapan bir kimlik doğrulama servisime sahibim.
checkAuthentication(){
this._authService.getAuthentication()
.subscribe(value => this.authenticated = value);
}
this.authenticated değeri değiştiğinde bir fonksiyonu nasıl çalıştırabilirim? ngOnChanges değişikliği algılamıyor.
Cevap #1
Serviste authenticated değerini tutmak ve bileşenler arasında paylaşmak için BehaviorSubject kullanabilirsiniz, farklı yerlerde doğrulamayı kontrol etmek için value'sini ve değişime tepki vermek için subscribe() yöntemini kullanabilirsiniz...
class AuthService {
public authenticated = new BehaviorSubject(null);
getAuthentication() {
this._http.get('/authenticate')
.map(response => response.json())
.map(json => Boolean(json)) // or whatever check you need...
.subscribe((value: boolean) => this.authenticated.next(value))
}
}
class Component {
constuctor(private _authService: AuthService) {
// Only check once even if component is
// destroyed and constructed again
if (this._authService.authenticated.value === null)
this._authService.getAuthentication();
}
onSubmit(){
if (!this._authService.authenticated.value)
throw new Error("You are authenticated!")
}
}
this.authenticateddeğeri değiştiğinde bir fonksiyonu nasıl çalıştırırım?
this._authService.authenticated
.subscribe((value: boolean) => console.log(value))
Cevap #2
Bence servisinize ait authenticated özelliği güncellendiğinde bunu tespit etmek için TypeScript’in get/set sözdizimini kullanabilirsiniz:
private _authenticated:Boolean = false;
get authenticated():Boolean {
return this._authenticated ;
}
set authenticated ( authenticated Boolean) {
// Plugin some processing here
this._ authenticated = authenticated;
}
Bir değer atandığında, "kimlik doğrulandı olarak ayarla" bloğu çağrılır. Örneğin, şu kod ile:
this.authenticated = true;
Daha fazla ayrıntı için bu soruya bakın:
- TypeScript'te alma ve ayarlama
Bununla birlikte, serviste bir EventEmitter özelliğinden de yararlanabilirsiniz. Authenticated özelliği güncellendiğinde, ilgili olay tetiklenebilir.
export class AuthService {
authenticatedChange: Subject<boolean> = new Subject();
constructor() {}
emit(authenticated) {
this.authenticatedChange.next(authenticated);
}
subscribe(component, callback) {
// set 'this' to component when callback is called
return this.authenticatedChange.subscribe(data => {
callback(component, data);
});
}
}
Daha fazla detay için bu linke bakın:
- Delegasyon: Angular2'de EventEmitter veya Observable
