【问题标题】:Map behavioursubject and assign it to same variable after mapping rxjs映射行为主体并在映射 rxjs 后将其分配给相同的变量
【发布时间】:2022-01-08 23:30:22
【问题描述】:

我有一个场景,我的子组件将 BehaviourSubject 作为输入,并且(子)在内部订阅它。 我需要在父级中的 BehaviourSubject 上进行过滤/映射,以便在调用 next() 的某个位置时,子订阅会接收映射/过滤后的值。

export class ParentComponent {
    public myBSubject: BehaviorSubject<ListFilter[]> = new BehaviorSubject<ListFilter[]>(undefined);
    public ngOnInit(): void {
        this.myBSubject = this.myBSubject.pipe(
          map((filters): ListFilter[] => {
            // Do some manipulation with filters
          return filters;
        }));
    }
}

模板

<child [myBSubject]="myBSubject"> </child>

ChildComponent(我无法控制它。)

export class ChildComponent {
 @Input()
  public myBSubject: BehaviorSubject<ListFilter[]> = new BehaviorSubject<ListFilter[]>(undefined);
  
  // somewhere subscription of myBSubject

}

问题是 .pipe(map) 将 BehaviourSubject 转换为 Observable,这是不可分配的。并且没有分配地图回调,因为地图不可变。

通过制作 .pipe(map..) as BehaviourSubject&lt;ListFilter&gt; 工作正常,但我觉得这不是一个好的解决方案。 请帮助我以更好的方式实现这一目标,谢谢。

【问题讨论】:

  • 所以这个behavioursubject是在parent中创建的并且只存在于那里? (除了孩子)我理解对了吗?
  • 它的引用仍然在父子节点中。唯一的事情是,如果不是从父级发送,则子级会默认初始化。
  • 我知道您不能更改 ChildComponent,但如果有任何方法可以与管理该组件的团队交谈,我建议更改为:twitter.com/joeflateau/status/1466479422207365137
  • 我在评论中看到你使用的是库,孩子使用的是什么库?谁知道呢,也许这也可能是一个 XY 问题。所以请提供minimal reproducible example
  • stackblitz.com/edit/…> 在这里我尝试添加一个示例,也许这会提供更多上下文。

标签: angular rxjs rxjs5


【解决方案1】:

请查看this answer 的类似问题。

除了此处描述的 2 个选项(使用 input property setter 或实现 OnChanges),我相信还有第三种可能适合您的需求,因为您的 BehaviorSubject 的数据来自另一个 observable。

在您的父组件中,更新第一个 observable 的订阅正文中的 BehaviorSubject 的值。然后在父组件的模板中,通过异步管道传递 BehaviorSubject 并将其用作子组件的输入。

父组件:

export class ParentComponent {
    public myBSubject: BehaviorSubject<ListFilter[]> = new BehaviorSubject<ListFilter[]>(undefined);
    public ngOnInit(): void {
        this.firstObservable.pipe(
          map(value => // map to ListFilter array here)
        ).subscribe(result => this.myBSubject.next(result));
    }
}

模板:

<child [myBSubject]="myBSubject | async"> </child>

【讨论】:

  • 不,这不是我的情况,正如我在问题中提到的,在子组件中很难更改,它是由其他(lib)编写的。而且没有其他可观察的,我希望当 myBSubject(behaviourSubject) 发出值时,它的订阅者会得到映射结果。
  • 您不能在 BehaviorSubject 的 .next() 函数中映射值吗?
  • 是的,在我可以映射的父组件中,但不是从子组件发出的。
  • 我不太明白您之前的回复,但看看您的示例(取决于您从哪里获取数据),您可能可以使用 myBSubject.next(someArray.map(values =&gt; //mapping function here)) 而不是管道
猜你喜欢
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 2022-12-07
  • 2015-10-03
  • 1970-01-01
  • 2017-09-13
相关资源
最近更新 更多