【问题标题】:How to handle multiple subscriptions on the same subject?如何处理同一主题的多个订阅?
【发布时间】:2019-06-16 19:05:07
【问题描述】:

我有以下场景:我有子组件,组件 A 和组件 B,它们从外部服务监听同一个主题,如下所示:

this.externalService.outcome.subscribe((event)=>{
  event.preventDefault();
  if(event.id === "SAVE"){
    // Do something individudal...
    this.externalService.save();
  }
})

基本上我是截取输出Subject,针对当前组件做一些特定的事情,然后手动触发保存动作。

现在在多个组件中包含这段代码可能会变得混乱并导致错误。我的所有组件都需要此订阅,因为它们每个都做一些单独的事情。

如何重构它,以便父组件/共享服务类管理所有订阅?因此,例如在子组件中,我只需定义一个方法应该做什么,然后我在父组件/共享服务中订阅 externalService.outcome 并基本上执行所有注册的功能?

编辑:问题是我还需要当前子组件的上下文。

EDIT2:总结起来应该是这样的顺序:

外部服务(库)调用 result.next() --> 我的 Parent 组件监听了 Subject 截获的结果:

this.externalService.outcome.subscribe((event)=>{
  event.preventDefault();
  if(event.id === "SAVE"){
    //SOMEHOW ENSURE ALL CHILD COMPONENTS ARE TRIGGERED
  }
 //manually trigger save outcome
 this.externalService.save();
 });

--> 在订阅中,我需要以某种方式触发我的子组件。例如,每个子组件都有一个方法“domeSomethingBeforeSave()”。但是我不知道我的子组件,所以我需要定义某种 registerfunction 来告诉我的父组件,应该调用哪些函数。

【问题讨论】:

    标签: html angular typescript rxjs observable


    【解决方案1】:

    调查问题的解决方案之一可能是:

    1. 在父组件订阅并在所有子组件中创建输入属性以传递数据。
    2. 然后在每个子组件的 ngOnChanges 事件上执行您想要的操作。

    【讨论】:

    • 好吧,它们是直接子组件的父级,所以我无法对输入做任何事情。另外我需要做的是基本上将一个功能推送给订阅的父级,以便父级/服务可以执行所有注册的功能并手动保存。
    • 这可能会有所帮助,请看一下:plnkr.co/edit/Z34dTgCyyZO0fjYG75xO?p=preview
    • 查看了一下,似乎并没有完全解决我的问题。我更新了我的问题
    【解决方案2】:

    您可以创建一个共享的父服务来注入父组件和子组件以使事情发生

    // sharedService with external service injected
    // you can take interceptor function as an param 
    this.onSave=(interceptor)=>this.externalService.outcome.pipe(filter(event=>event.id === "SAVE"),
    map(res=>interceptor(res))
    )
    

    在您的父组件或子组件中,您始终可以连接到这些 observable 来做任何您想做的事情

    // pass in interceptor
    this.sharedService.onSave(doSomethingBeforeSave).subscribe()
    

    【讨论】:

    • 不幸的是,我无法访问外部服务,因为它是一个库。还有我需要在父组件中做的doSave。我会更新我的问题
    • 更新了答案,但是如果您有多个拦截器,则需要进行更复杂的设置,因为它与执行顺序是一对多的关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2014-01-21
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多