2016-02-21 11 views
13

Ich habe einen Authentifizierungsdienst, der die authentifizierte Variable gleich wahr oder falsch macht.Angular2 - Abonnement für Änderungen der Dienstvariablen

checkAuthentication(){ 
    this._authService.getAuthentication() 
    .subscribe(value => this.authenticated = value); 
} 

Wie führe ich eine Funktion, wenn this.authenticated Wert geändert hat? ngOnChanges nimmt die Änderung nicht auf.

Antwort

19

authenticated in Betrieb zu halten und zwischen den Komponenten teilen Sie BehaviorSubject verwenden können, ist es value Authentifizierung an verschiedenen Orten zu überprüfen, und es ist subscribe() Verfahren auf Veränderungen zu reagieren ...

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!") 
    } 
} 

Wie führe ich eine Funktion aus, wenn this.authenticated Wert geändert hat?

this._authService.authenticated 
    .subscribe((value: boolean) => console.log(value)) 
+0

Hallo @Sasxa also, wenn ich z. 5 Komponenten. 'home.component.ts',' footer.component.ts', 'navbar.component.ts',' x.component.ts' und 'user.component.ts'. Angenommen, diese 5 Komponenten, und wenn ich nach authentifizierten überprüfen möchte. Ich muss hinzufügen, inject das folgende: 'Konstruktor (private _authService: AuthService) {...}' zu allen meinen 5 Komponenten. Ist das richtig? und mach ein 'ngOnInit' für alle 5 Komponenten?Brauchen Sie Hilfe, um das Angular2-Authentifizierungskonzept zu verstehen. –

+1

Es gibt viele Optionen/Auswahlmöglichkeiten. Alles hängt davon ab, was Sie tun. Sie können sich bei jeder Komponente oder nur bei der Root-Komponente authentifizieren. Es ist ein komplexes Thema, Sie müssen entscheiden, was am besten für Ihre App ist (; – Sasxa

+0

Könnten Sie mich auf Diskussion/Forum/Blog/Artikel zu diesem Thema? –

9

Ich denke, dass Sie die get/set-Syntax von Typoskript nutzen könnte zu erkennen, wenn Ihre authentifizierten Eigenschaft Ihres Service aktualisiert:

private _authenticated:Boolean = false; 
    get authenticated():Boolean { 
     return this._authenticated ; 
    } 
    set authenticated (authenticated Boolean) { 
    // Plugin some processing here 
     this._ authenticated = authenticated; 
    } 

Wenn ein Wert zuweisen, stellen Sie den“authentifiziert "Block wird aufgerufen. Zum Beispiel mit einem solchen Code:

this.authenticated = true; 

Sehen Sie diese Frage für weitere Informationen:

Das heißt Sie auch eine EventEmitter Eigenschaft in den Dienst nutzen können. Wenn die authentifizierte Eigenschaft aktualisiert wird, kann das entsprechende Ereignis ausgelöst werden.

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); 
    }); 
    } 
} 

Siehe diesen Link für weitere Informationen:

+0

Ist es eine gute Ansatz zu gehen, wie Sie vorschlagen, einige Ereignisse auf 'authentifizierten' Wert auslösen? Ideal Setter sind verantwortlich für Einrichten von Wert durch Manipulation der bereitgestellten Eingabewert zu seiner Funktion .. –

+0

Hallo Thierry, ich suchte Angular.io Website für Dokumentation/Tutorial auf EventEmitter.Aber es war ziemlich begrenzt.Eine Idee, wo ich eine Anleitung zur Verwendung von Angular2 EventEmitter finden kann? –

+1

Dies wird als schlechte Praxis angesehen.Ein empfohlener Ansatz ist die Verwendung von Subject/BehaviorSubject – atsituab

0

Es hängt davon ab, wer das Ereignis behandeln muss. Wenn es die übergeordnete Komponente ist, können Sie die Ausgabe Ereignisbindungen nutzen:

@Output authenticationChange: EventEmitter<Boolean> = new EventEmitter(); 
checkAuthentication(){ 
    this._authService.getAuthentication() 
    .subscribe(value => 
      if(value != this.authenticated) { 
       this.authenticated = value); 
       this.authenticationChange.emit(value); 
     }); 
} 

Und in Ihrer Stammkomponente:

<directive (authenticationChange)="doSomething()"> 
-2

benutzen ich ein {{ showValue() }} in der Komponentenvorlage und in der .ts-Datei Ich rief die Variable des Service

Dank Angular2 GUI-2-Wege-Bindung funktioniert es.

Verwandte Themen