angularjs RXJS -使用多个键的定义直到更改

x7yiwoj4  于 2023-01-16  发布在  Angular
关注(0)|答案(4)|浏览(121)

如果三个对象键中有一个发生了变化,我想为我的oberservable触发.subscribe()
如果我复制并粘贴每个键的方法,它就可以工作:

this.myService.loadData(this.dataContainer.id, true)
      .distinctUntilChanged((updatedData) => { return updatedData.relations; })
      .subscribe(updatedData => {
        console.log("relations changed",updatedData);
    });

this.myService.loadData(this.dataContainer.id, true)
      .distinctUntilChanged((updatedData) => { return updatedData.parent; })
      .subscribe(updatedData => {
        console.log("parent changed",updatedData);
    });

this.myService.loadData(this.dataContainer.id, true)
      .distinctUntilChanged((updatedData) => { return updatedData.children; })
      .subscribe(updatedData => {
        console.log("children changed",updatedData);
    });

如果我设置distinctUntilChanged比较器返回整个updatedData对象,我的订阅永远不会触发。
如何将三个dinstinctUntilChanged组合成一个减速器?

w1e3prcc

w1e3prcc1#

最后我做了:

.distinctUntilChanged((a, b) => a.key1 === b.key1 && a.key2 === b.key2);
qyzbxkaa

qyzbxkaa2#

一种方法:

const data$ = this.myService.loadData(this.dataContainer.id, true);

Observable
  .combineLatest(
    $data.distinctUntilChanged(data => updatedData.relations),
    $data.distinctUntilChanged(data => updatedData.parent),
    $data.distinctUntilChanged(data => updatedData.children),
    data => data
  )
  .subscribe(updatedData => {
    console.log("relation|parent|children changed", updatedData);
  });
k97glaaz

k97glaaz3#

另一个选择可能是返回选择器中的所有数据,并在比较函数中比较不同的属性:

this.myService.loadData(this.dataContainer.id, true)
  .distinctUntilChanged((updatedData) => { return updatedData; }, (a, b) => {
    return a.relations === b.relations && a.parent === b.parent && a.children === b.children;
  })
  .subscribe(updatedData => {
    console.log("updatedData", updatedData);
});
5cnsuln7

5cnsuln74#

还有一种方法来自lodash:(x一个月一个月+x一个月一个月一个月)

dashboardMessages$ = this.user$.pipe(
    map((user: User) => pick(user, 'subscriptionStatus', 'payoutsEnabled')),
    distinctUntilChanged(isEqual),
    map((user: Pick<User, 'subscriptionStatus' | 'payoutsEnabled'>) => {
      // there you go... with your partial user model
    }),

  );

相关问题