Gibt es eine Möglichkeit, dass wir auf eine andere Komponente von @CanActivate in Angular2 umleiten können?Umleiten zu einer anderen Komponente in @CanActivate in Angular2
Antwort
Ja, Sie können! Dadurch wird verhindert, dass Ihre Komponente für nichts instanziiert wird.
zunächst eine neue Datei src/app-injector.ts
let appInjectorRef;
export const appInjector:any = (injector = false) => {
if (!injector) {
return appInjectorRef;
}
appInjectorRef = injector;
return appInjectorRef;
};
Dann wird aus den Referenz erhalten bootstrap
// ...
import {appInjector} from './app-injector';
// ...
bootstrap(App, [
ROUTER_PROVIDERS
]).then((appRef) => appInjector(appRef.injector));
schließlich in Ihrer Funktion
// ...
import {appInjector} from './app-injector';
// ...
@CanActivate((next, prev) => {
let injector = appInjector();
let router = injector.get(Router);
if (42 != 4 + 2) {
router.navigate(['You', 'Shall', 'Not', 'Pass']);
return false;
}
return true;
})
Et voilà!
Es wurde hier diskutiert https://github.com/angular/angular/issues/4112
Sie ein vollständiges Beispiel hier http://plnkr.co/edit/siMNH53PCuvUBRLk6suc?p=preview von @brandonroberts finden
Edited Ihre Antwort (falls zugelassen): 'Export const appInject: any' sonst Fehler auf Typoskript Kompilierung geworfen werden. – lexith
Ab heute mit den neuesten @ Winkel/Router 3.0.0-rc.1, hier sind ein paar Referenzen auf, wie das durch CanActivate
Wachen auf den Strecken zu tun:
- angular 2 reference
- Zwei Antworten auf diese Frage SO, von Nilz11 und von Jason
Der Haupt Kern der Logik wie folgt aussieht:
// ...
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
if (this.authService.isLoggedIn) {
// all ok, proceed navigation to routed component
return true;
}
else {
// start a new navigation to redirect to login page
this.router.navigate(['/login']);
// abort current navigation
return false;
}
}
Dies sollte die neue bevorzugte Antwort mit dem neuen Router sein. –
würde gerne sehen, wie die Umleitung auf den beabsichtigten Pfad erfolgt, nachdem Benutzer mit diesem Auth-Wächter loggt. – Davvit
@Davvit Ich bin mir nicht sicher, was ich mit der vorgeschlagenen Bearbeitung machen soll: Indem wir nur einen Parameter zu einem Anruf hinzufügen, liefern wir nicht viel mehr Informationen. Wäre es nicht hilfreicher für mich und andere, wenn Sie eine neue Antwort hinzufügen, in die Sie alle Ergänzungen und Änderungen einfügen, um Ihre Anfrage zu beantworten? Was denken Sie? – superjos
Angular 2.0 Endlösung:
Ihre Wache kann kann, die als solche leicht nur eine injizierbare sein eigene Injektionen enthalten. So können wir einfach den Router einspeisen, um umzuleiten. Vergessen Sie nicht, den Dienst als Anbieter in Ihrem App-Modul hinzuzufügen.
Dies könnte jemand helfen, der versucht, auf etwas zu warten, bevor Sie fortfahren.
waitForBonusToLoad(): Observable<[boolean, string]> {
const userClassBonusLoaded$ = this.store.select(fromRoot.getUserClasssBonusLoaded);
const userClassSelected$ = this.store.select(fromRoot.getClassAttendancesSelectedId);
return userClassBonusLoaded$.withLatestFrom(userClassSelected$)
.do(([val, val2]) => {
if (val === null && val2 !== null) {
this.store.dispatch(new userClassBonus.LoadAction(val2));
}
})
.filter(([val, val2]) => {
if(val === null && val2 === null) return true;
else return val;
})
.map(val => {
return val;
})
.take(1);
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.waitForBonusToLoad().map(([val, val2]) =>
{
if(val === null && val2 === null){
this.router.navigate(['/portal/user-bio']);
return false;
}
else {
return true;
}
}
)
}
Ihre vorgeschlagene Lösung enthält Nebenwirkungen innerhalb von Observable.map() Stattdessen sollten Sie die Navigation aus map() und in do() verschieben. Ihre Karte sollte einfach TRUE/FALSE auflösen. Observable $ .map ((x) => x === 1) .do (result => {if (result) navigate();}); –
- 1. Angular2 CanActivate globale Funktionsdeklaration
- 2. Kann den Wert des Service in @CanActivate Dekorator in Komponente
- 3. Angular2 CanActivate von Beta zu aktuellen RC3
- 4. Angular2 Zugriff Variablen von einer anderen Komponente
- 5. Angular2 Wie kann ich mit Javascript XMLHttpRequest zu einer anderen Komponente umleiten?
- 6. Angular2 Router in einer Komponente
- 7. Angular2 Komponente dynamisch innerhalb einer anderen Komponente ersetzen
- 8. Umleiten zu einer anderen Seite in node.js
- 9. Angular2, Wie verwende ich ein Objekt von einer Komponente zu einer anderen Komponente?
- 10. Angular2 canActivate() ruft asynchrone Funktion auf
- 11. Angular2- Verwenden einer Komponente aus einer anderen Anwendung
- 12. Angular2 Komponente Methoden in eine andere Komponente importieren
- 13. Angular2 zwei Routen zu einer Komponente?
- 14. Umleiten in neue Angular2-Route
- 15. Statische Literalwerte in einer angular2-Komponente einstellen
- 16. Wie Angular2 zu binden Komponente in innerHTML
- 17. Angular2 Router canActivate kein Provider für falsche
- 18. Nicht möglich, Daten von einer Komponente zu anderen in angular2 zu übergeben
- 19. Angular2 Router umadressiert zu root Komponente
- 20. Wrong zu Komponente übergebenen Daten in Angular2
- 21. Umleiten von einer eckigen App zu einer anderen in ionischen
- 22. umleiten alle ungültigen URLs zu einer bestimmten Komponente mit angular2 rc4
- 23. Hinzufügen einer Komponente zu einer anderen Komponente React
- 24. Angular 2 Fehler beim Routing zu einer anderen Komponente
- 25. Umleiten zu einer anderen Seite von Silverlight
- 26. Umleiten zu einer anderen Site Angular
- 27. Umleiten zu Aktion in einem anderen Controller
- 28. Umleiten zu einer anderen URL bei Aktualisierung
- 29. Umleiten zu Aktion in anderen Controller
- 30. Angular 2: Injection eine Abhängigkeit in @CanActivate?
Bitte geben Sie die akzeptierte Antwort ändern anstelle der veralteten Antwort von Jk Jensen @ superjos Antwort, –