Czy istnieje sposób, w jaki możemy przekierować do innego komponentu z @CanActivate w Angular2?Przekierowanie do innego komponentu w środku @CanActivate w Angular2
Odpowiedz
Tak, możesz! Wykonanie tej czynności uniemożliwi Twojemu komponentowi tworzenie instancji za darmo.
Najpierw utworzyć nowy plik src/app-injector.ts
let appInjectorRef;
export const appInjector:any = (injector = false) => {
if (!injector) {
return appInjectorRef;
}
appInjectorRef = injector;
return appInjectorRef;
};
Następnie uzyskać referencję bootstrap
// ...
import {appInjector} from './app-injector';
// ...
bootstrap(App, [
ROUTER_PROVIDERS
]).then((appRef) => appInjector(appRef.injector));
Ostatecznie w swojej funkcji
// ...
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 voà!
To był omawiany tutaj https://github.com/angular/angular/issues/4112
można znaleźć pełny przykład tutaj http://plnkr.co/edit/siMNH53PCuvUBRLk6suc?p=preview przez @brandonroberts
edytowano odpowiedź (jeżeli zatwierdzone): 'const eksport appInject: any' inaczej błędy zostaną rzucone na maszynopis kompilacji. – lexith
Na dzień dzisiejszy, z najnowszej @ kątowe/routera 3.0.0-rc.1, oto kilka referencji, w jaki sposób to zrobić poprzez CanActivate
strażników na trasach:
- angular 2 reference
- dwie odpowiedzi na to pytanie SO, przez Nilz11 i Jason
Główny sens logiki wygląda następująco:
// ...
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;
}
}
Powinna to być nowa preferowana odpowiedź z nowym routerem. –
Chciałbym zobaczyć, jak przekierowanie do zamierzonej ścieżki jest wykonywane po dziennikach użytkowników za pomocą tego auth guarda. – Davvit
@Davvit Nie jestem pewien, co zrobić z proponowaną zmianą: po prostu dodając parametr do rozmowy, nie dostarczamy znacznie więcej informacji. Czy nie byłbyś bardziej pomocny dla mnie i innych, gdybyś dodał nową odpowiedź, w której umieścisz wszystkie dodatki i zmiany, aby spełnić twoje zapytanie? Co myślisz? – superjos
Kątowymi 2,0 ostatecznego rozwiązania:
baczności mogą łatwo być tylko do wstrzyknięć, która jako taka może zawierają własne środki do wstrzykiwania. Możemy więc po prostu wprowadzić router, aby przekierować. Nie zapomnij dodać usługi jako dostawcy do modułu aplikacji.
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private router: Router, private authService: AuthService) {}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
if (!authService.isAuthenticated()) {
this.router.navigate(['/login']);
return false;
}
return true;
}
}
export const ROUTES: Routes = [
{path: 'login', component: LoginComponent},
{path: 'protected', loadChildren: 'DashboardComponent', canActivate: [AuthGuard]}
];
To może pomóc komuś, kto próbuje coś poczekać, zanim przejdzie dalej.
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;
}
}
)
}
Twoje proponowane rozwiązanie zawiera efekty uboczne w Observable.map() Zamiast tego powinieneś przenieść nawigację poza mapę() i do zrobić(). Twoja mapa powinna po prostu rozwiązać TRUE/FALSE. Obserwowalne $ .map ((x) => x === 1) .do (result => {if (result) navigate();}); –
- 1. Przekierowanie Angular2 po zalogowaniu
- 2. Angular2 - zwróć boolean z subskrypcją canActivate
- 3. Przekierowanie wewnątrz komponentu Kątowymi 2
- 4. Angular2 Html wewnątrz komponentu
- 5. Wywołanie metody komponentu z HTML w Angular2
- 6. Jak uzyskać dostęp do globalnej zmiennej JS w angular2 komponentu
- 7. Angular 2: Wprowadzić zależność do @CanActivate?
- 8. angular2: jak skopiować obiekt do innego obiektu
- 9. Przekierowanie z jednego widoku do innego - Yii2
- 10. Jak przekazać zmienną stateName do innego komponentu w reakcji
- 11. Przekierowanie 302 do protokołu innego niż HTTP
- 12. Przekierowanie do innego widoku po przesłaniu formularza
- 13. Przekierowanie stdin w programie C do innego procesu
- 14. Angular2 ładowanie komponentu zewnętrznego pliku js lib
- 15. Angular2: atrybuty ng-content przechodzące do komponentu potomnego
- 16. Jak ładować komponent dynamicznie za pomocą nazwy komponentu w angular2?
- 17. Routing Angular2 - przekazywanie danych z komponentu nadrzędnego do komponentu podrzędnego podrzędnego
- 18. Infinite Nested Routing w Angular2
- 19. Jak uzyskać dostęp do metody z app.component z innego komponentu?
- 20. Div poziomo w środku i w pionie w środku
- 21. C# przekierowanie (potok) przetwarzanie danych wyjściowych do innego procesu
- 22. Informuj składnik podrzędny o zmianach w Angular2
- 23. Nie można zaimportować komponentu użytkownika - Angular2 i TypeScript
- 24. . Przekierowanie htaccess z jednego podfolderu do innego podfolderu
- 25. wyciąć div i html w środku i wkleić go do innego div z jquery
- 26. Angular2: Zapobiegać uwierzytelnionym użytkownikom dostępu do określonych trasach
- 27. Wyślij zarówno statusu 404 i przekierowanie do 404 komponentu w routerze reagować-
- 28. Jak uzyskać dostęp do elementu wideo HTML w Angular2
- 29. Kątowa data w środku modalnego
- 30. Instrukcja w środku konkatenacji?
Proszę zmienić przyjętą odpowiedź @ odpowiedź superjos męska, zamiast przestarzałej odpowiedź od Jk Jensen –