angular - RxJS distinctUntilChanged - 对象比较

标签 angular reactive-programming rxjs

我有一个对象流,我需要比较当前对象是否与前一个对象不同,在这种情况下会发出一个新值。我发现 distinctUntilChanged 运算符应该完全按照我的意愿行事,但出于某种原因,除了第一个之外,它从不发出任何值。如果我删除 distinctUntilChanged 值,则会正常发出。

我的代码:

export class SettingsPage {
    static get parameters() {
        return [[NavController], [UserProvider]];
    }

    constructor(nav, user) {
        this.nav = nav;
        this._user = user;

        this.typeChangeStream = new Subject();
        this.notifications = {};
    }

    ngOnInit() {

        this.typeChangeStream
            .map(x => {console.log('value on way to distinct', x); return x;})
            .distinctUntilChanged(x => JSON.stringify(x))
            .subscribe(settings => {
                console.log('typeChangeStream', settings);
                this._user.setNotificationSettings(settings);
            });
    }

    toggleType() {
        this.typeChangeStream.next({
            "sound": true,
            "vibrate": false,
            "badge": false,
            "types": {
                "newDeals": true,
                "nearDeals": true,
                "tematicDeals": false,
                "infoWarnings": false,
                "expireDeals": true
            }
        });
    }

    emitDifferent() {
        this.typeChangeStream.next({
            "sound": false,
            "vibrate": false,
            "badge": false,
            "types": {
                "newDeals": false,
                "nearDeals": false,
                "tematicDeals": false,
                "infoWarnings": false,
                "expireDeals": false
            }
        });
    }
}

最佳答案

我遇到了同样的问题,并通过使用 JSON.stringify 比较对象修复了它:

.distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b))

如果属性的顺序相同,此代码将有效,否则可能会中断,因此这里有一个快速修复方法(注意此方法较慢)

.distinctUntilChanged((a, b) => JSON.stringify(a).split('').sort().join('') === JSON.stringify(b).split( '').sort().join(''))

关于angular - RxJS distinctUntilChanged - 对象比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172395/

相关文章:

angular - p-table paginatorLeft 和 paginatorRight 不显示

javascript - 如何使用 JavaScript 存储网页/网页数据?

c# - 等待 IObservable 获取所有元素错误

协议(protocol)中的 Swift 元组声明

javascript - 在 React Native 中使用 this.props.children 加载大组件是否存在性能问题?

angular - 根据响应递归组合 HTTP 结果

angular - 当超过 6 个参数时,Observable.forkJoin 返回类型错误

angular - 去除@HostListener 事件

Angular 不编译 SASS/SCSS 文件

rxjs - 将前 3 个项目延迟 1 秒,第四个项目延迟 4 秒