在 mat-sidenav-content 中渲染组件
render component in mat-sidenav-content
我使用以下 HTML 模板创建了一个 angular material sidenav:
<mat-sidenav-container>
<mat-sidenav>
<!--menu component added here-->
</mat-sidenav>
<mat-sidenav-content>
<app-home></app-home>
<router-outlet></router-outlet>
</mat-sidenav-content>
</mat-sidenav-container>
第一次加载模板时,将呈现 app-home 组件。选择菜单项时,相关组件将在 mat-sidenav-component 中呈现,但 app-home 仍会出现。我可以在选择菜单项时隐藏它吗?
由于我对问题的误解,我进行了最后一次编辑。
作为介绍信息:如果您使用 Angualr 或 Angular Material,方法是相同的。
编辑: 这里你可以看到同样的方法应用于Angular Material:Stack blitz example
原文:
是的,您的菜单组件必须使用 eventEmitter
向页面容器发送 boolean
输入,因此当页面加载时,输入的默认状态为 true
并且单击菜单项时输入状态将变为 false
并且 app-home
将被隐藏。
你的页面容器(或sidenav主要组件)会像这样
// Imports omitted
@Component({
selector: 'page-container',
template: `
<mat-sidenav-container>
<mat-sidenav opened mode="side">Lorem ipsum</mat-sidenav>
<mat-sidenav-content>
<menu-component (show)="show($event)" (hide)="hide($event)"></menu-component>
</mat-sidenav-content>
<mat-sidenav-content>
<app-home [toggle]="visible"></app-home>
</mat-sidenav-content>
</mat-sidenav-container>`
})
export class PageContainerPage {
visible: boolean;
show(event: boolean) {
this.visible = event;
}
hide(event: boolean) {
this.visible = event;
}
}
你的 menu 组件将是这样的 - 这里使用 event emitter and output
// Imports omitted
@Component({
selector: 'menu',
template: `
<ul>
<li (click)="showElement()">menu item 1</li>
<li (click)="hideElement()">menu item 2</li>
</ul>`
})
export class MenuComponent {
showHideBoolean: boolean; // Just delete default value
// Output to send
@Output() show: EventEmitter<Boolean> = new EventEmitter<Boolean>();
@Output() hide: EventEmitter<Boolean> = new EventEmitter<Boolean>();
showHideElement(){
console.log('you have click on a menu item')
this.showHideBoolean = !this.showHideBoolean;
if (this.showHideBoolean) {
this.show.emit(true);
console.log('value to send: ', this.showHideBoolean)
} else {
this.hide.emit(false);
console.log('value to send: ', this.showHideBoolean)
}
}
}
你的 app-home 组件将是这样的 - 这里使用 input
@Component({
selector: 'app-home',
template: `
<div [hidden]="toggle">I'm the first element</div>
<div [ngClass]="{'color-red' : toggle}">I'm the second element!</div>
<div *ngIf="toggle">I'm an element too!</div>`
})
export class AppHomeComponent {
// Use @Import here
@Input() toggle: Boolean; // Just remove the default value
}
我使用以下 HTML 模板创建了一个 angular material sidenav:
<mat-sidenav-container>
<mat-sidenav>
<!--menu component added here-->
</mat-sidenav>
<mat-sidenav-content>
<app-home></app-home>
<router-outlet></router-outlet>
</mat-sidenav-content>
</mat-sidenav-container>
第一次加载模板时,将呈现 app-home 组件。选择菜单项时,相关组件将在 mat-sidenav-component 中呈现,但 app-home 仍会出现。我可以在选择菜单项时隐藏它吗?
由于我对问题的误解,我进行了最后一次编辑。
作为介绍信息:如果您使用 Angualr 或 Angular Material,方法是相同的。
编辑: 这里你可以看到同样的方法应用于Angular Material:Stack blitz example
原文:
是的,您的菜单组件必须使用 eventEmitter
向页面容器发送 boolean
输入,因此当页面加载时,输入的默认状态为 true
并且单击菜单项时输入状态将变为 false
并且 app-home
将被隐藏。
你的页面容器(或sidenav主要组件)会像这样
// Imports omitted
@Component({
selector: 'page-container',
template: `
<mat-sidenav-container>
<mat-sidenav opened mode="side">Lorem ipsum</mat-sidenav>
<mat-sidenav-content>
<menu-component (show)="show($event)" (hide)="hide($event)"></menu-component>
</mat-sidenav-content>
<mat-sidenav-content>
<app-home [toggle]="visible"></app-home>
</mat-sidenav-content>
</mat-sidenav-container>`
})
export class PageContainerPage {
visible: boolean;
show(event: boolean) {
this.visible = event;
}
hide(event: boolean) {
this.visible = event;
}
}
你的 menu 组件将是这样的 - 这里使用 event emitter and output
// Imports omitted
@Component({
selector: 'menu',
template: `
<ul>
<li (click)="showElement()">menu item 1</li>
<li (click)="hideElement()">menu item 2</li>
</ul>`
})
export class MenuComponent {
showHideBoolean: boolean; // Just delete default value
// Output to send
@Output() show: EventEmitter<Boolean> = new EventEmitter<Boolean>();
@Output() hide: EventEmitter<Boolean> = new EventEmitter<Boolean>();
showHideElement(){
console.log('you have click on a menu item')
this.showHideBoolean = !this.showHideBoolean;
if (this.showHideBoolean) {
this.show.emit(true);
console.log('value to send: ', this.showHideBoolean)
} else {
this.hide.emit(false);
console.log('value to send: ', this.showHideBoolean)
}
}
}
你的 app-home 组件将是这样的 - 这里使用 input
@Component({
selector: 'app-home',
template: `
<div [hidden]="toggle">I'm the first element</div>
<div [ngClass]="{'color-red' : toggle}">I'm the second element!</div>
<div *ngIf="toggle">I'm an element too!</div>`
})
export class AppHomeComponent {
// Use @Import here
@Input() toggle: Boolean; // Just remove the default value
}