【问题标题】:How to hide and replace a component in Angular2如何在Angular2中隐藏和替换组件
【发布时间】:2016-07-18 22:36:09
【问题描述】:

您好,我有一个父组件 (A),它有 2 个子组件(B 和 C)。默认情况下,父 A 显示子组件 B。现在,当单击父 A 上显示的按钮时,它会将子组件 B 替换为子组件 C。在 angular2 中单击按钮后,如何将组件 B 替换为组件 C?

【问题讨论】:

    标签: typescript angular angular2-components


    【解决方案1】:

    通常,您会在父 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

    【讨论】:

      【解决方案2】:

      为此,您可以使用*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 更适合吗?
      • 当然,您可以将 isOn 变量更改为代表所选组件的 String,然后为每个可能的场景添加 ngSwitchCase。
      • 是的,如果您有多个子组件,使用ngSwitch 会更容易。 *ngIfngSwitch 都删除并重新创建 DOM 元素。我在 plunker 中添加了一个 ngSwitch 案例:plnkr.co/edit/7b1eWgSHiM1QV6vDUAB0
      • 很高兴为您提供帮助 :) 如果它回答了您的问题,我认为您应该接受答案。
      • "*ngIf 删除并重新创建元素:"...这就是我想知道的...谢谢!
      猜你喜欢
      • 2018-03-29
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多