2016-08-10 2 views
3

Die CanActivate class ermöglicht eine Observable<boolean> Rückgabetyp.Warum gibt CanActivate von Angular 2 ein Observable <boolean> statt einer Versprechung zurück?

Die einzigen Anwendungsfälle, die Sinn für mich sind:

  1. CanActivate könnte ‚asynchron‘ blockieren eine Route angezeigt wird, bis observer.next(true|false) genannt wird.
  2. Ich könnte eine Route anzeigen, die CanActivate ermöglicht dann drücken Sie eine observer.next(false) von einem anderen Teil meiner App und haben diese Route verschwinden.

Punkt eins funktioniert aber nicht Punkt zwei. Daher kann ich keinen Grund finden, warum CanActivate einen Rückgabetyp von Observable<boolean> anderen als Komfort zulassen sollte - was wiederum die API kompliziert. Es wäre sauberer, wenn CanActivate nur eine boolean Rückgabetyp und Promise erlaubt.

Bitte beachten Sie, dass ich Angular, RxJS und alles Node neu bin, damit ich das Offensichtliche vermisse. Ich habe eine Weile damit verbracht, die Funktionalität aus CanActivate zu extrahieren, die der Rückgabetyp Observer<boolean> impliziert.

+0

Es ist ihre Entscheidung, keine Promises zu verwenden und sie durch Observables zu ersetzen. Sie können sicherlich eine Observable haben, die nur einen einzigen Wert vor dem Abschluss zurückgibt, alle http Aufrufe sind jetzt zum Beispiel Versprechungen. –

+0

Warum fragen Sie nicht die Entwickler, die den Router gebaut haben, auf dem der v3 Router basierte? [Erstellen Sie ein Problem] (https://github.com/ngrx/router/issues), stellen Sie die Frage und Sie erhalten wahrscheinlich eine Antwort. – cartant

+0

Ok wird es tun. War mir nicht sicher, ob das eine dumme Frage war. – Dan

Antwort

0

In AngularJS 2 gibt fast jede asynchrone Operation Observable zurück. Da Sie ein eigenes CanActivate implementieren können, sollten Sie dies mit dem Serverzugriff tun. Zum Beispiel, um Admin-Anmeldedaten auf dem Server zu überprüfen. Sie können ähnliches Beispiel here sehen.

Wenn diese Methode den booleschen Datentyp zurückgegeben hat, müssen Sie die Seite blockieren, um dies zu tun.

0

Sie können einige asynchrone Prozesse durchführen. Stellen Sie sich vor, Sie haben eine currentUser Beobachtung von einem Authentifizierungsdienst. Es ist ein ReplaySubscriber(1); und wird immer den aktuell angemeldeten Benutzer zurückgeben, aber wenn Ihre App zuerst lädt, kann der Auth-Anruf noch verarbeitet werden, so dass Sie nicht wissen, ob es abgeschlossen ist.

CanActivate() { 
    return this.currentUser.map(user => user && user.isActive()); 
} 
+0

Die Verwendung eines 'Observable' bedeutet, dass ich auch die Funktionalität bekomme, wie ich sie in Punkt zwei meiner Frage beschrieben habe, da sie dafür gedacht sind, [mehrere Werte] zu drücken (http://reactivex.io/rxjs/manual/overview.html#observable). . 'CanActivate' kann nur einen * Wert * drücken, bevor es sich vom Observablen abmeldet. Daher ist sicherlich ein "Promise" -Rückgabetyp angemessener. Ich werde meine Frage mit mehr Klarheit aktualisieren. – Dan

+0

Ich glaube, die CanActivate wird nur vor der Aktivierung überprüft. Ich glaube nicht, dass es nach der Aktivierung der Route weiter auf dieses Observable hört. –

+0

Ja, das ist die Funktionalität, die ich sehe, weshalb ich die Rückgabe eines Versprechens angemessener finde. – Dan

Verwandte Themen