Ich bin noch ziemlich neu in Angular 2, hoffentlich könnt ihr mir helfen.Angular 2 - Inhalt wird nicht in Router Outlet geladen
Ich habe eine ziemlich einfache App, es gibt eine Login-Seite, nach erfolgreicher Anmeldung wird der Benutzer auf eine Seite mit einem Sidemenu geleitet. Der Anmeldebildschirm hat dieses Seitenmenü nicht. Wenn sich der Benutzer abmeldet, wird er erneut zur Anmeldeseite geleitet.
Das Problem ist, dass nach dem Login das Sidemenu sichtbar wird, aber der andere Inhalt nur nach einer Aktualisierung sichtbar ist. Gleiches gilt für die Abmeldung, nach dem Abmelden ist die Seite leer, erst nach dem Refresh wird der Inhalt (Login-Seite) angezeigt. Ich mache wahrscheinlich etwas falsch, aber selbst nachdem ich andere Fragen untersucht habe, kann ich es nicht herausfinden.
Hier ist meine Route:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProfileComponent } from './profile-component/profile-component.component'
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { LoginComponent } from './login/login.component';
import { LoggedInGuard } from './logged-in/logged-in.guard';
const appRoutes: Routes = [
{path: 'profile', component: ProfileComponent, canActivate: [LoggedInGuard]},
{path: 'login', component: LoginComponent},
{path: '', component: LoginComponent},
{path: '**', component: PageNotFoundComponent},
];
@NgModule({
imports: [
RouterModule.forRoot(appRoutes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {
}
Die LoginComponent
:
import {Component, OnInit} from '@angular/core';
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
import {LoginService} from '../login-service/login-service.service';
import {Router} from '@angular/router';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.scss'],
providers: [ LoginService ]
})
export class LoginComponent implements OnInit {
loginForm: FormGroup;
error: String;
constructor(private formBuilder: FormBuilder,
private loginService: LoginService,
private router: Router) {
}
ngOnInit() {
if (this.loginService.isLoggedIn()) {
this.router.navigate(['/profile']);
}
this.loginForm = this.formBuilder.group({
username: ['', Validators.required],
password: ['', Validators.required]
});
}
login(): void {
let self = this;
this.loginService.login(this.loginForm.value.username, this.loginForm.value.password).subscribe(function (result) {
if (result) {
self.router.navigate(['/profile']);
}
}, function (error) {
self.error = 'Invalid';
});
}
}
Die AppComponent
HTML sieht wie folgt aus:
<md-toolbar color="primary" *ngIf="isLoggedIn()">
<span>Sporter volgsysteem</span>
</md-toolbar>
<md-sidenav-layout *ngIf="isLoggedIn()">
<md-sidenav #start mode="side" [opened]="true">
<a routerLink="/add" routerLinkActive="active" md-button color="primary" disabled="false"><md-icon class="icon">add</md-icon><span class="nav-item">Toevoegen</span></a>
<a routerLink="/compare" routerLinkActive="active" md-button color="primary"><md-icon class="icon">swap_horiz</md-icon><span class="nav-item">Vergelijken</span></a>
<a routerLink="/search" routerLinkActive="active" md-button color="primary"><md-icon class="icon">search</md-icon><span class="nav-item">Zoeken</span></a>
<a routerLink="/profile" routerLinkActive="active" md-button color="primary"><md-icon class="icon">account_box</md-icon><span class="nav-item">Profiel</span></a>
<a routerLink="/feedback" routerLinkActive="active" md-button color="primary"><md-icon class="icon">feedback</md-icon><span class="nav-item">Feedback</span></a>
<a routerLink="/faq" routerLinkActive="active" md-button color="primary"><md-icon class="icon">info</md-icon><span class="nav-item">FAQ</span></a>
<div class="spacer"></div>
<a md-button color="primary" routerLink="/login" (click)="logout()"><md-icon class="icon">exit_to_app</md-icon><span class="nav-item">Uitloggen</span></a>
</md-sidenav>
<router-outlet></router-outlet>
</md-sidenav-layout>
<router-outlet *ngIf="!isLoggedIn()"></router-outlet>
AppComponent
:
import {Component} from '@angular/core';
import {LoginService} from "./login-service/login-service.service";
import {Router } from '@angular/router'
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
providers: []
})
export class AppComponent {
constructor(private loginService : LoginService,
private router: Router) {
}
logout() {
this.loginService.logout();
this.router.navigate(['/login']);
}
isLoggedIn() {
return this.loginService.isLoggedIn();
}
}
Warum ist nicht der Inhalt der ProfileComponent
nach der Anmeldung angezeigt, und warum wird nicht die Anmeldeseite nach dem Abmelden angezeigt, aber beide angezeigt, wenn Sie aktualisieren?
aktualisieren
meisten vorgeschlagen, dass es auf mehrere ungenannte router-outlet
gebührt s so zu überprüfen, ob ich einen der Auslässe entfernt und das Layout sidemenu die ganze Zeit zeigen. Zu Testzwecken natürlich. Das löst das Problem nicht, es gibt mir das gleiche Verhalten: Der Profilinhalt wird erst nach dem Refresh geladen.
Update 2 ich dies zu raten, ist im Zusammenhang mit dem *ngIf
router-outlet
Ihr 'AppComponent' hat 2' 'und beide haben keinen' name = "xxx" '. Es ist nur ein unbenannter Router-Ausgang pro Route erlaubt. –
@ GünterZöchbauer Obwohl nur 1 wegen '* ngIf' sichtbar ist? Ich bekomme keine Fehler in der Konsole. –
Ah, Entschuldigung, ich habe das erste '* ngIf' verpasst. –