打开和关闭 ng-bootstrap 警报组件(ngb-alert)

Open and close ng-bootstrap alert component (ngb-alert)

考虑以下 StackBlitz:

AlertComponent

正如我们所见,我们有两个按钮可以显示或隐藏警报。问题是,当通过符号关闭 (X) 关闭警报时,即使您按下 false 按钮​​,警报也不会再次显示。要再次显示警报,我必须按 true 按钮,然后按 false 按钮​​,以便再次显示该警报。为什么会这样?我想要一个解释。谢谢!

内部组件的staticAlertClosed标志是一个输入,但是内部组件改变了它的值所以

  • 通过按下 false 按钮​​将外部值设置为 false,将 false 值作为输入传递给内部组件,并显示警报。标志的值在外部组件中为 false,在内部组件中为 false
  • 使用关闭按钮关闭警报会将内部组件标志设置为 true,使警报消失。标志的值在外部组件中为 false,在内部组件中为 true
  • 单击外部组件中的 false 按钮会将外部标志的值设置为 false。但是这个值已经是假的了。所以值没有改变,因此 Angular 不会将值传递给内部组件的输入:它没有改变。这说明了问题。标志的值在外部组件中为 false,在内部组件中为 true
  • 点击 true 按钮会使外部组件中的标志值发生变化。所以它再次传递给内部组件。标志的值在外部组件中为 true,在内部组件中为 true
  • 单击 false 按钮​​会使外部组件中的标志值发生变化。所以它再次传递给内部组件。标志的值在外部组件中为 false,在内部组件中为 false。正在重新显示警报。

简而言之:不要修改接收输入的组件的输入值。只有父组件应该修改输入值。要解决此问题,您可以使用双向绑定。 这里是 a demo.

我发现了一个问题。当您单击 AlertComponent 中的退出标志时,您只会触发 staticAlertClosed 变量的更改,但不会更改 AppComponent.

中变量的值

有多种方法可以修复它,但这是我所做的。

Stackblitz link - https://stackblitz.com/edit/angular-to9vlk-nyog3i?embed=1&file=app/app.component.html

我在 AppComponent 中用变量挂钩了输出事件。查看源代码了解更多信息