angular - 当 BehaviorSubject 两次发出真值时触发 ngOnChange
问题描述
我正在开发一个 Angular 5 应用程序。我有一个下拉组件(它在 html 文件dropdown.component.html中有以下代码
<p-dropdown [options]="data" [(ngModel)]="selectedFilterValue" placeholder="Please Select" [style]="{width: '100%'}" (onChange)="selectedValueChanged($event)"></p-dropdown>
dropdown.component.tc
export class DropdownComponent implements OnInit, OnChanges {
constructor() { }
@Input() ddOptions: string[] = [];
@Input() filterName: string;
@Input() clearDropDown: boolean = false;
我在我的父库中使用这个下拉组件,我在其中显示 3 个下拉列表,代码如下所示, parent.component.html
<div class="container">
<div class="row">
<div class="col-4">
<div class="d-flex flex-row align-items-center">
<span class="col-xs-auto">PBG:</span>
<arcm-dropdown class="col" [ddOptions]="pbgFilterValues" [clearDropDown]="clearDropdownObservable | async" (filterValue)="selectedValueChanged($event,FilterName.PBG)"></arcm-dropdown>
</div>
</div>
<div class="col-4">
<div class="d-flex flex-row align-items-center">
<span class="col-xs-auto">Wafer Size:</span>
<arcm-dropdown class="col" [ddOptions]="waferSizeFilterValues" [clearDropDown]="clearDropdownObservable | async" (filterValue)="selectedValueChanged($event,FilterName.WaferSize)"></arcm-dropdown>
</div>
</div>
父组件.ts
clearFilters(e:any):void{
this.clearDropdownSubject.next(true);
}
现在我在父页面上有一个名为“清除过滤器”的按钮,单击该按钮时,我会从我的 BehaviorSubject 发出一个值为 true 的值。该值被子下拉组件订阅。 问题是: 当我第一次将值发出为“true”时,子组件(下拉组件)ngOnChanges 会被触发,但是当我再次发出相同的值时,ngOnchang 不会触发,我知道为什么。在这种情况下我该怎么办。
我想过发出随机数而不是布尔值,但有时随机数可能相同,这将使我的“清除过滤器”按钮不起作用。
解决方案
我最近遇到了同样的问题。因此,我没有将原始布尔值推送到 BehaviorSubject 流,而是使用了一个对象。例如,在您的代码中,定义如下接口:
export interface Clear {
clear: Boolean;
}
然后,将您的父组件更改为:
clearDropdownSubject$: BehaviorSubject<Clear> = new BehaviorSubject({clear: false});
.
.
.
clearFilters(e:any):void{
this.clearDropdownSubject.next({clear: true});
}
最后,在您的 DropdownComponent 中:
@Input() clearDropDown: Clear = {clear: false};
并相应地更新您的代码。
推荐阅读
- javascript - 如果已授予权限,如何在不单击按钮的情况下显示用户位置
- java - 如何为带有变量的按钮定义命令
- python - 在数据框的两列之间进行插值
- java - 为什么需要yield,因为即使没有调用yield方法,任何线程都可能会进入就绪状态
- node.js - 如何有效地在 MEAN Web 应用程序上实现类似功能?
- c# - Razor 表加载速度极慢
- spring-boot - Google App Engine 忽略 Springboot 应用程序属性
- encryption - 使用 OpenSSL 的 RSA 解密原语 (SP800-56B)
- javascript - 将照片从数据库上传到客户端
- python - 如何在信号中找到峰值之前的实例?