输入 属性 事件发射器后未更新 - angular
Input property not updating after event emitter - angular
我有 3 个组件,其中一个组件在另一个组件中使用。考虑 app, form-details, form-html
。 form-details
被用作 app
组件中的子项。并且 form-html
被用作 form-details
组件内的子组件。
从 app
组件更新 form-details
组件的 input
属性 以显示或隐藏 form-html
组件。而且我还从 form-html
本身发出一个事件来隐藏表单。
这里的问题是,一旦从 form-html
组件发出事件以隐藏表单。如果我尝试使用 app
组件中的按钮打开表单,form-details
组件中的 input
属性 不会立即更新。我们需要点击按钮 2 次才能显示表单。为什么会这样?
因为我正在使用 ChangeDetectionStrategy.OnPush
尝试使用来自 changeDetectorRef 的 detectChanges
方法解决问题,但没有帮助我。
请从 here 找到 stackblitz 来检查问题
我建议不要跨组件使用事件发射器,而是将服务注入到组件中,并在其中设置和读取这些组件的属性。通过这种方式,您可以让您的组件没有业务逻辑,并在服务中处理它。这是一种更好的做法,因为您不必依赖事件来启用组件间的通信。这是一种更好的编程模式,因为它以更低的性能成本实现了更高的可重用性,并且您能够将业务逻辑保留在一个地方,从而更容易弄清楚您的应用程序中发生了什么。如果您有 100 个组件,并且每个组件都包含业务逻辑,那么维护和弄清楚您的应用程序中发生的事情会变得非常繁重。
如果您在控制台登录 app.component,您将看到问题:
displayForm() {
console.log(!this.showForm)
this.showForm = !this.showForm;
}
那里的 onPush 变化检测没有问题,只是 app.component 不知道 showForm 正在变化,因为他从未从 details.component 获得变化,所以它继续正常流程:是的-> 假 -> 真 -> 等...
在 details.component 中实现一个新的 EventEmitter 并在你的 app.component 中捕获事件就可以了,或者像 andriusain 所说的共享服务
我有 3 个组件,其中一个组件在另一个组件中使用。考虑 app, form-details, form-html
。 form-details
被用作 app
组件中的子项。并且 form-html
被用作 form-details
组件内的子组件。
从 app
组件更新 form-details
组件的 input
属性 以显示或隐藏 form-html
组件。而且我还从 form-html
本身发出一个事件来隐藏表单。
这里的问题是,一旦从 form-html
组件发出事件以隐藏表单。如果我尝试使用 app
组件中的按钮打开表单,form-details
组件中的 input
属性 不会立即更新。我们需要点击按钮 2 次才能显示表单。为什么会这样?
因为我正在使用 ChangeDetectionStrategy.OnPush
尝试使用来自 changeDetectorRef 的 detectChanges
方法解决问题,但没有帮助我。
请从 here 找到 stackblitz 来检查问题
我建议不要跨组件使用事件发射器,而是将服务注入到组件中,并在其中设置和读取这些组件的属性。通过这种方式,您可以让您的组件没有业务逻辑,并在服务中处理它。这是一种更好的做法,因为您不必依赖事件来启用组件间的通信。这是一种更好的编程模式,因为它以更低的性能成本实现了更高的可重用性,并且您能够将业务逻辑保留在一个地方,从而更容易弄清楚您的应用程序中发生了什么。如果您有 100 个组件,并且每个组件都包含业务逻辑,那么维护和弄清楚您的应用程序中发生的事情会变得非常繁重。
如果您在控制台登录 app.component,您将看到问题:
displayForm() {
console.log(!this.showForm)
this.showForm = !this.showForm;
}
那里的 onPush 变化检测没有问题,只是 app.component 不知道 showForm 正在变化,因为他从未从 details.component 获得变化,所以它继续正常流程:是的-> 假 -> 真 -> 等...
在 details.component 中实现一个新的 EventEmitter 并在你的 app.component 中捕获事件就可以了,或者像 andriusain 所说的共享服务