将仪表板添加到 app.component
Adding dashboard to the app.component
我有登录组件和应用程序组件。当用户登录时,显示以下视图,
现在用户可以单击侧边导航菜单按钮来获取其他详细信息,例如仪表板。像这样,
当我们单击仪表板时,仪表板组件应与侧面菜单按钮和工具栏一起显示。
对于侧边菜单按钮和工具栏,我有一个名为应用程序模型的单独组件。
applayoutmodel.component.html
<div class="page">
<div>
<mat-toolbar color="primary" class="toolbar">
<div>
<button class="menuButton" mat-icon-button (click)="sidenav.toggle()"><mat-icon>menu</mat-icon></button>
<span class="companyName">Hello</span>
</div>
</mat-toolbar>
</div>
<mat-sidenav-container class="sideContainer" fullscreen autosize style="top: 80px !important;">
<mat-sidenav #sidenav mode="push" opened="false" class="sideNav">
<mat-nav-list>
<button (click)="onDashboardClicked()">Dashboard</button>
<nav class="menuItems">
<a routerLink="/login">Login</a>
</nav>
</mat-nav-list>
</mat-sidenav>
</mat-sidenav-container>
</div>
applayoutmodel.component.ts
import { Component, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params } from '@angular/router';
import { LoginService } from '../../serviceProviders/loginservice';
import { LoginComponent } from '../pages/login/login.component';
@Component({
selector: 'app-applayoutmodel',
templateUrl: './applayoutmodel.component.html',
styleUrls: ['./applayoutmodel.component.scss']
})
export class ApplayoutmodelComponent implements OnInit {
user_id: string = undefined;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService) { }
ngOnInit() {
}
onDashboardClicked() {
this.router.navigate(['/dashboard']);
}
}
app.component.html
<div *ngIf="showComponent">
<app-applayoutmodel></app-applayoutmodel>
</div>
<div>
<router-outlet></router-outlet>
</div>
app.component.ts
import { Component, Input, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params} from '@angular/router';
import * as globals from '../app/pages/models/myGlobals';
import { LoginService } from '../serviceProviders/loginservice';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'app';
showComponent = false;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService ) {}
ngOnInit() {
console.log(this.router.url);
if ( this.router.url !== '/') {
this.showComponent = true;
}
console.log(this.showComponent);
}
}
路由模块为
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './pages/login/login.component';
import { AppComponent } from './app.component';
import { DashboardComponent } from '../app/pages/dashboard/dashboard.component';
const routes: Routes = [
{path: 'login', component: LoginComponent},
{path: '', redirectTo: '/login', pathMatch: 'full'},
{path: 'dashboard', component: DashboardComponent },
{path: 'applayout', component: AppComponent}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forRoot(routes)
],
exports: [
RouterModule
],
declarations: []
})
export class AppRoutingModule { }
我希望的输出是
看起来,你直接将 opened="false"
传递给 mat-sidebar
最终会使侧边栏处于关闭状态。即使切换 showComponent
也不会改变边栏状态。
在这种情况下,我建议您将 showComponent
添加到 @Input
绑定到 AppLayoutModel
组件,并使用相同的方式切换 opened
状态 mat-sidebar
组件。同时将 showComponent
标志更改为 showSidebar
.
app.component.html
import { Component, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params } from '@angular/router';
import { LoginService } from '../../serviceProviders/loginservice';
import { LoginComponent } from '../pages/login/login.component';
@Component({
selector: 'app-applayoutmodel',
...
})
export class ApplayoutmodelComponent implements OnInit {
user_id: string = undefined;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService) { }
@Input() showSidebar: boolean;
....
}
Html
<mat-sidenav-container class="sideContainer" fullscreen autosize style="top: 80px !important;">
<mat-sidenav #sidenav mode="push" [opened]="showSidebar" class="sideNav">
.....
</mat-sidenav>
</mat-sidenav-container>
Post 登录,将所有其他路由视为应用程序组件的子路由。
因此,您的路线将如下所示,
const routes: Routes = [
{path: 'login', component: LoginComponent},
{path: '', redirectTo: '/login', pathMatch: 'full'},
{path: 'applayout', component: AppComponent, children:[
{path: 'dashboard', component: DashboardComponent }
]}
];
应用程序组件将包含顶部导航栏。导航到仪表板后,仪表板组件将在应用程序组件内呈现。因此,导航栏将出现在仪表板页面中,如上图所示。
到仪表板的路线将是 applayout/dashboard
.
我有登录组件和应用程序组件。当用户登录时,显示以下视图,
现在用户可以单击侧边导航菜单按钮来获取其他详细信息,例如仪表板。像这样,
当我们单击仪表板时,仪表板组件应与侧面菜单按钮和工具栏一起显示。
对于侧边菜单按钮和工具栏,我有一个名为应用程序模型的单独组件。
applayoutmodel.component.html
<div class="page">
<div>
<mat-toolbar color="primary" class="toolbar">
<div>
<button class="menuButton" mat-icon-button (click)="sidenav.toggle()"><mat-icon>menu</mat-icon></button>
<span class="companyName">Hello</span>
</div>
</mat-toolbar>
</div>
<mat-sidenav-container class="sideContainer" fullscreen autosize style="top: 80px !important;">
<mat-sidenav #sidenav mode="push" opened="false" class="sideNav">
<mat-nav-list>
<button (click)="onDashboardClicked()">Dashboard</button>
<nav class="menuItems">
<a routerLink="/login">Login</a>
</nav>
</mat-nav-list>
</mat-sidenav>
</mat-sidenav-container>
</div>
applayoutmodel.component.ts
import { Component, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params } from '@angular/router';
import { LoginService } from '../../serviceProviders/loginservice';
import { LoginComponent } from '../pages/login/login.component';
@Component({
selector: 'app-applayoutmodel',
templateUrl: './applayoutmodel.component.html',
styleUrls: ['./applayoutmodel.component.scss']
})
export class ApplayoutmodelComponent implements OnInit {
user_id: string = undefined;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService) { }
ngOnInit() {
}
onDashboardClicked() {
this.router.navigate(['/dashboard']);
}
}
app.component.html
<div *ngIf="showComponent">
<app-applayoutmodel></app-applayoutmodel>
</div>
<div>
<router-outlet></router-outlet>
</div>
app.component.ts
import { Component, Input, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params} from '@angular/router';
import * as globals from '../app/pages/models/myGlobals';
import { LoginService } from '../serviceProviders/loginservice';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = 'app';
showComponent = false;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService ) {}
ngOnInit() {
console.log(this.router.url);
if ( this.router.url !== '/') {
this.showComponent = true;
}
console.log(this.showComponent);
}
}
路由模块为
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule, Routes } from '@angular/router';
import { LoginComponent } from './pages/login/login.component';
import { AppComponent } from './app.component';
import { DashboardComponent } from '../app/pages/dashboard/dashboard.component';
const routes: Routes = [
{path: 'login', component: LoginComponent},
{path: '', redirectTo: '/login', pathMatch: 'full'},
{path: 'dashboard', component: DashboardComponent },
{path: 'applayout', component: AppComponent}
];
@NgModule({
imports: [
CommonModule,
RouterModule.forRoot(routes)
],
exports: [
RouterModule
],
declarations: []
})
export class AppRoutingModule { }
我希望的输出是
看起来,你直接将 opened="false"
传递给 mat-sidebar
最终会使侧边栏处于关闭状态。即使切换 showComponent
也不会改变边栏状态。
在这种情况下,我建议您将 showComponent
添加到 @Input
绑定到 AppLayoutModel
组件,并使用相同的方式切换 opened
状态 mat-sidebar
组件。同时将 showComponent
标志更改为 showSidebar
.
app.component.html
import { Component, OnInit } from '@angular/core';
import { Router, NavigationExtras, ActivatedRoute , Params } from '@angular/router';
import { LoginService } from '../../serviceProviders/loginservice';
import { LoginComponent } from '../pages/login/login.component';
@Component({
selector: 'app-applayoutmodel',
...
})
export class ApplayoutmodelComponent implements OnInit {
user_id: string = undefined;
constructor(
private route: ActivatedRoute,
private router: Router,
private loginservice: LoginService) { }
@Input() showSidebar: boolean;
....
}
Html
<mat-sidenav-container class="sideContainer" fullscreen autosize style="top: 80px !important;">
<mat-sidenav #sidenav mode="push" [opened]="showSidebar" class="sideNav">
.....
</mat-sidenav>
</mat-sidenav-container>
Post 登录,将所有其他路由视为应用程序组件的子路由。 因此,您的路线将如下所示,
const routes: Routes = [
{path: 'login', component: LoginComponent},
{path: '', redirectTo: '/login', pathMatch: 'full'},
{path: 'applayout', component: AppComponent, children:[
{path: 'dashboard', component: DashboardComponent }
]}
];
应用程序组件将包含顶部导航栏。导航到仪表板后,仪表板组件将在应用程序组件内呈现。因此,导航栏将出现在仪表板页面中,如上图所示。
到仪表板的路线将是 applayout/dashboard
.