比较 Observable 的前一个值与 Angular 中的下一个值

2024-04-28

我一直在开发一个应用程序,它允许几个不同的组件更新BehaviorSubject在角度。在每个组件中,我存储前一个组件的本地副本BehaviorSubject价值。为了知道组件是否生成了被推出的新值,我计划使用 LoDash 来比较两个对象_.isEqual()功能。然而我发现我的本地 Observable 副本在进行比较之前就已经更新了。

Angular 是否寻找=语句并在 Observable 之外创建到该组件属性的外部绑定next功能?

鉴于下面的代码我发现我的this.QueryParams组件内的属性已更新为函数中正在处理的当前值,导致我的比较失败,即使我直到if声明已被评估。

成分

export class LogsModalComponent implements OnInit {

    private QueryParams: LogsQueryParameters

    ngOnInit() {

        this._LogsService.QueryParameters$.subscribe(_QueryParams => {
            console.log(this.QueryParams);
            console.log(_QueryParams);

            if (!_.isEqual(this.QueryParams, _QueryParams) {
                this.QueryParams = _QueryParams;

                // Some code to process if the new value was different.
            }
        }
    }

    updateStartDate() {
        this.QueryParams.filterStartDate = _.isUndefined(this.FilterStartDate) ? NaN : new Date(this.FilterStartDate.nativeElement.value).getTime();
        this._LogsService.updateQueryParams(this.QueryParams);
}
}

Service

    LogsQueryParameters: BehaviorSubject<LogsQueryParameters> = new BehaviorSubject<LogsQueryParameters>({
            limit: 25,
            logLevels: "",
            logTypes: "",
            logUserIDs: "",
            filterStartDate: NaN,
            filterEndDate: NaN
        })
        LogsQueryParameters$ = this.LogsQueryParameters.asObservable();

    updateQueryParams(QueryParams) {
        this.LogsQueryParameters.next(QueryParams);
    }

RxJS observables 有一个方法distinctUntilChanged() http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-distinctUntilChanged返回一个新的可观察量,仅当与之前发出的值不同时才发出新值:

this._LogsService.QueryParameters
    .distinctUntilChanged()
    .subscribe((_QueryParams) => this.QueryParams = _QueryParams);

这适用于简单的比较。如果您需要_.isEqual尽管如此,您可以将回调传递给distinctUntilChanged()执行比较:

this._LogsService.QueryParameters
    .distinctUntilChanged((prev, curr) => _.isEqual(prev, curr))
    .subscribe((_QueryParams) => this.QueryParams = _QueryParams);

请注意,您不会返回! ...在回调内部,每当返回值是false(表示被测值不等于), 价值passes.

Update

从您最新的编辑来看,您实际上传递的是完全相同的对象,只是改变了其内容,正如 @Brandon 在下面的评论中建议的那样。您可以尝试在更新时创建一个新对象,通过Object.assign():

updateStartDate() {
    this.QueryParams.filterStartDate = _.isUndefined(this.FilterStartDate)
        ? NaN 
        : new Date(this.FilterStartDate.nativeElement.value).getTime();
    this._LogsService.updateQueryParams(Object.assign({}, this.QueryParams));
}

对象实际上是通过引用传递的。

注意new Date()还返回一个对象。该对象也通过引用传递和分配,只是这一次Object.assign不会帮助你,因为日期对象取决于原型链接(它不是plain目的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较 Observable 的前一个值与 Angular 中的下一个值 的相关文章

随机推荐