首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular11 rxjs开关映射即使在外部可观察触发器时也不能工作。

Angular11 rxjs开关映射即使在外部可观察触发器时也不能工作。
EN

Stack Overflow用户
提问于 2022-02-03 17:12:37
回答 1查看 310关注 0票数 0

我正在尝试下面这基本上需要触发每次过滤器被改变。任何人都可以帮助我在使用更高等级的观测值时做错了什么。

工作版本:

代码语言:javascript
复制
this.filterservice.registerFilters({
                key: this.FILTERS_KEY,
                filters: this.AUDIT_FILTERS,
                sorts: [new DateSort({ for: 'modifiedOn' })]
            }).pipe(
                takeUntil(this.destroy$)
            ).subscribe(filters => {
                this.filters = filters;
                this.auditBuilderListService.changeFilter(filters);
                this.auditData$ = this.auditBuilderListService.auditBuilderData$;
            });

有开关图(不工作):

代码语言:javascript
复制
registerFilters$ = this.filterservice.registerFilters({
        key: this.FILTERS_KEY,
        filters: this.AUDIT_FILTERS,
        sorts: [new DateSort({ for: 'modifiedOn' })]
    });

    auditData$ = this.registerFilters$.pipe(
        switchMap((filters) => {
            this.filters = filters;
            this.auditBuilderListService.changeFilter(filters);
            return this.auditBuilderListService.auditBuilderData$;
        }),
        takeUntil(this.destroy$)
    );

在役:

代码语言:javascript
复制
auditBuilderData$ = combineLatest([
    this.pageNumberSubject,
    this.filterAction$
]).pipe(
    switchMap(([currentPage, filterParameters]) => {
        return this.getAudits(filterParameters, currentPage, this.pageSize);
    }),
    shareReplay(1)
);

没有开关图的工作版本: auditData$:可观察;

代码语言:javascript
复制
registerFilters$ = this.filterservice.registerFilters({
    key: this.FILTERS_KEY,
    filters: this.AUDIT_FILTERS,
    sorts: [new DateSort({ for: 'modifiedOn' })]
}).pipe(
    tap(filters => {
        this.auditBuilderListService.setPage(1);
        this.filters = filters;
        this.auditBuilderListService.changeFilter(filters);         
    }),
    takeUntil(this.destroy$)
);

    this.registerFilters$
        .pipe(takeUntil(this.destroy$))
        .subscribe(filters => {
            this.auditData$ = this.auditBuilderListService.auditBuilderData$;
        });

但是否有更好的方法来实现同样的目标呢?

EN

回答 1

Stack Overflow用户

发布于 2022-02-04 00:35:06

关于auditBuilderListSerivce,我假设调用changeFilter()会导致auditBuilderData$发出一个新值。如果是这样的话,这就解释了为什么您的switchMap不能工作。返回auditBuilderData$太晚了,因为它会在调用changeFilter()时发出值。

至于解决方案,您可以让changeFilter()返回您想要发出的值(如果可能的话)。另一种选择是分别引用和订阅auditBuilderData$

代码语言:javascript
复制
registerFilters$ = this.filterservice.registerFilters({
  key: this.FILTERS_KEY,
  filters: this.AUDIT_FILTERS,
  sorts: [new DateSort({ for: 'modifiedOn' })],
}).pipe(
  tap(filters =>{
    this.filters = filters;
    this.auditBuilderListService.changeFilter(filters);
  }),
  takeUntil(this.destroy$)
);

auditData$ = this.auditBuilderListService.auditBuilderData$;
  takeUntil(this.destroy$)
);

当您对这两个可观察到的对象进行活动订阅时,registerFilters$将调用changeFilter()作为副作用,这将导致auditData$发出它的新值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70975502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档