在父母中动态儿童组成部分



我正在构建一个使用Angular4和VMware的Clarity UI的应用程序。我有一个主要的标题用于导航该应用程序。应用程序中有一些视图,不需要侧边栏和其他视图。如果视图具有特定的视图,我想在用户导航时显示特定于特定视图的侧边栏。我还在应用程序中使用模块级别路由。

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { MainComponent } from './main.component';
const routes: Routes = [
    {
        path: '', component: MainComponent,
        children: [
            {
                path: 'dashboard',
                loadChildren: './dashboard/dashboard.module#DashboardModule',
                data: {
                    title: 'Dashboard',
                    showSideNav: false
                }
            },
            {
                path: 'sales',
                loadChildren: './sales/sales.module#SalesModule',
                data: {
                    title: 'Sales',
                    showSideNav: true
                }
            }
        ]
    }
];
@NgModule({
    imports: [RouterModule.forChild(routes)],
    exports: [RouterModule]
})
export class MainRoutingModule { }

这是MainComponent

import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
@Component({
    selector: 'app-main',
    templateUrl: './main.component.html',
    styleUrls: ['./main.component.scss']
})
export class MainComponent implements OnInit {
    showSideNav: Boolean = false;
    constructor(public router: Router, public activatedRoute: ActivatedRoute) { }
    setSidenavState() {
        this.router.events
            .filter(event => event instanceof NavigationEnd)
            .map(() => this.activatedRoute)
            .map(route => {
                while (route.firstChild) {
                    route = route.firstChild;
                }
                return route;
            })
            .filter(route => route.outlet === 'primary')
            .mergeMap(route => route.data)
            .subscribe((event) => { 
                this.showSideNav = event['showSideNav'];
                console.log(this.showSideNav);
            });
    }
    ngOnInit() {
        this.setSidenavState();
        if (this.router.url === '/') {
            this.router.navigate(['/dashboard']);
        }
    }
}

这是主要模板

<clr-main-container>
    <header class="header header-6">
        <div class="branding">
            <a routerLink="/dashboard" class="brand nav-link">
                <img src="assets/img/logo-white.png">
            </a>
        </div>
        <div class="header-nav">
            <a routerLink="/dashboard" routerLinkActive="active" class="nav-link nav-text">Dashboard</a>
            <a routerLink="/sales" routerLinkActive="active" class="nav-link nav-text">Sales</a>
            <a href="" class="nav-link nav-text">Purchases</a>
            <a href="" class="nav-link nav-text">Contacts</a>
            <a href="" class="nav-link nav-text">Reports</a>
        </div>
    </header>
    <div class="content-container">
        <div class="content-area">
            <router-outlet></router-outlet>
        </div>
        <nav class="sidenav" *ngIf="showSideNav">
            <app-sidenav></app-sidenav>
        </nav>
    </div>
</clr-main-container>

在主组件中,我有这样的设置

+-- dashboard
+-- sales
|   +-- sidenav
+-- sidenav
|   +-- sidenav.component.html
|   +-- sidenav.component.ts
+-- main-routing.module.ts
+-- main.component.html
+-- main.component.ts
+-- main.module.ts

我的问题是,如果将showSideNav属性设置为true,则如何将特定视图的不同的Sidenav组件注入app-sidenav组件中。任何建议或链接都将不胜感激。

我相信,解决用例的最干净的方法只是将一点点布局移至实际路由组件。现在,您在主模板中有一个:

<div class="content-container">
    <div class="content-area">
        <router-outlet></router-outlet>
    </div>
    <nav class="sidenav" *ngIf="showSideNav">
        <app-sidenav></app-sidenav>
    </nav>
</div>

,假设您的销售模板看起来像这样:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>

通过将sidenav 向路由组件移动到中,您的主模板变为:

<div class="content-container">
    <router-outlet></router-outlet>
</div>

您的销售模板变为:

<div class="content-area">
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
<nav class="sidenav">
    <sales-sidenav></sales-sidenav>
</nav>

如果组件没有侧翼,则根本不要将Sidenav放入模板中。无需*ngIf。结果是,您不再使用Sidenav信息来污染您的路线,只需将其留在处理路线本身的组件中,就成为应该拥有特定Sidenav逻辑的组件。

最新更新