【发布时间】:2016-07-18 22:36:09
【问题描述】:
您好,我有一个父组件 (A),它有 2 个子组件(B 和 C)。默认情况下,父 A 显示子组件 B。现在,当单击父 A 上显示的按钮时,它会将子组件 B 替换为子组件 C。在 angular2 中单击按钮后,如何将组件 B 替换为组件 C?
【问题讨论】:
标签: typescript angular angular2-components
您好,我有一个父组件 (A),它有 2 个子组件(B 和 C)。默认情况下,父 A 显示子组件 B。现在,当单击父 A 上显示的按钮时,它会将子组件 B 替换为子组件 C。在 angular2 中单击按钮后,如何将组件 B 替换为组件 C?
【问题讨论】:
标签: typescript angular angular2-components
通常,您会在父 A 的模板中同时包含这两个组件,但您会使用 ngIf 使它们仅在应该出现的时候出现。
<button (click)="setButtonClicked(true)">Click Me</button>
<component-b *ngIf="!buttonWasClicked"></component-b>
<component-c *ngIf="buttonWasClicked"></component-c>
在 Parent A 的模型中,您将有相应的代码来设置属性:
buttonWasClicked: boolean = false;
setButtonClicked(clicked: boolean) {
this.buttonWasClicked = clicked;
}
您可能更喜欢使用NgSwitch 而不是NgIf。
【讨论】:
为此,您可以使用*ngIf 指令或hidden 属性。
注意区别:
*ngIf 删除并重新创建元素:如果分配给 ngIf 的表达式的计算结果为假值,则 元素从 DOM 中移除,否则该元素的克隆是 重新插入到 DOM 中。
hidden 使用 display: none 隐藏元素
来自 angular`sdocumentation:
显示/隐藏技术可能适用于小型元素树。我们 隐藏大树时应小心; NgIf 可能是更安全的选择。 总是在得出结论之前进行衡量。
查看以下示例:
@Component({
selector: 'my-app',
template: `
<b>Using *ngIf:</b>
<div *ngIf="!isOn">Light Off</div>
<div *ngIf="isOn">Light On</div>
<br />
<b>Using [hidden]:</b>
<div [hidden]="isOn">Light Off</div>
<div [hidden]="!isOn">Light On</div>
<br />
<button (click)="setState()">{{ getButtonText() }}</button>
`
})
export class AppComponent {
private isOn: boolean = false;
getButtonText(): string {
return `Switch ${ this.isOn ? 'Off' : 'On' }`;
}
setState(): void {
this.isOn = !this.isOn;
}
}
Plunker:http://plnkr.co/edit/7b1eWgSHiM1QV6vDUAB0
为了进一步阅读[hidden],我指出这篇文章:http://angularjs.blogspot.com.br/2016/04/5-rookie-mistakes-to-avoid-with-angular.html
希望对您有所帮助。
【讨论】:
ngSwitch 会更容易。 *ngIf 和 ngSwitch 都删除并重新创建 DOM 元素。我在 plunker 中添加了一个 ngSwitch 案例:plnkr.co/edit/7b1eWgSHiM1QV6vDUAB0。