从 Angular 5 中的子组件更新父布尔值

Jor*_*ber 5 javascript toggle typescript angular-components angular

我只想在单击子组件中的按钮时更新父组件中的布尔值。我有一个基于动态 ngClass 隐藏和显示的滑出式子组件。该类是根据父级的布尔值设置的。但是,当我从子项中的按钮关闭该组件时,我想更新父项中的布尔值:

父组件打字稿:

export class AppComponent implements OnInit   {

  showFlyout: boolean

  constructor() {}

  ngOnInit() {
    this.showFlyout = false;
  }
}
Run Code Online (Sandbox Code Playgroud)

和父 html:

<main>

  <button (click)="showFlyout = !showFlyout"><i class="fa fa-check"></i>Show Flyout</button>

  {{showFlyout}}

  <app-child id="flyout" [ngClass]="showFlyout ? 'active' : ''"></app-child>

</main>
Run Code Online (Sandbox Code Playgroud)

子组件打字稿:

export class ActivateFlyoutComponent implements OnInit {

  constructor() { }

  ngOnInit() {
  }

  closeActivationFlyout() {
    const flyout = document.getElementById('flyout');
    flyout.classList.remove('active');
  }

}
Run Code Online (Sandbox Code Playgroud)

和子组件html:

<button (click)="closeFlyout()">Close</button>
Run Code Online (Sandbox Code Playgroud)

这是一个Stackblitz。您可以看到单击父按钮正确切换类,但是如何从子组件中的单击更新该布尔值,从而使子组件中的 closeActivationFlyout() 方法变得不必要?

Jun*_*ang 5

@Output()像其他人提到的那样使用,但它需要发出一个事件,您还需要检查在父 html 中触发的事件。

这是一个有效的StackBlitz

在子组件中。

@Output() onCloseClick = new EventEmitter();

closeFlyout() {
  this.onCloseClick.emit();
}
Run Code Online (Sandbox Code Playgroud)

并在父组件 html 中。

<app-child id="flyout" [ngClass]="showFlyout ? 'active' : ''" (onCloseClick)="showFlyout = false"></app-child>
Run Code Online (Sandbox Code Playgroud)

您还可以在父组件中创建一个函数,并触发类似 (onCloseClick)="doFunction()"