【问题标题】:How to pass a value from a service, to a component's method如何将值从服务传递到组件的方法
【发布时间】:2019-10-01 04:07:09
【问题描述】:

我有一项服务,用于在 2 个组件之间共享数据。该部分完美无缺,但现在我需要调用组件 A 的方法,当服务上触发某些东西时(并将值传递给该组件)。我怎样才能做到这一点?我读到较早的问题,这是一种错误的方法,但由于我是菜鸟,我不知道要寻找什么解决方案。 我需要使用 observables 吗?

【问题讨论】:

  • “我需要使用 observables 吗?” - 是的。您的服务将持有一个可观察的。您的组件获取对此 observable 的引用并订阅它。当触发发生时,您的服务会将数据“推送”到 observable 中。订阅该 observable 的任何内容(在本例中为您的组件)都将获取数据。
  • 非常感谢您的回答。我现在只需要弄清楚语法!
  • 添加到@Joseph 的评论中,您可以使用 BehaviorSubject(observable 的子类型)。请参阅此answer 以获取有关执行此操作的信息。如果两个组件有父子关系,那么考虑使用绑定。此answer 中的更多信息。

标签: javascript angular typescript


【解决方案1】:

我认为约瑟夫的想法是要走的路。

这是我的实现方式:

class FooService {
 private _newEvents = new Subject();
 newEvents$ = this._newEvents.asObservable();

 addNewEvent (ev) {
   this._newEvents.next(e);
  } 
}

// Allow `A` class to communicate with `B` class

class A {
 addEvent (ev) {
   this.fooService.addNewEvent(ev);
  }
}

class B {
 private subscription: Subscription;

 ngOnInit () {
  this.subscription = this.fooService.newEvents$
   .subscribe(e => {})
 }

 ngOnDestroy () {
  this.subscription.unsubscribe();
 }
}

请注意,如果您的 B 类订阅了多个 observable,您应该使用 takeUntil 等解决方案取消订阅。

【讨论】:

    【解决方案2】:

    Observables / Subjects 是一种方式。您将在服务中拥有一个Subject,并在其上使用.next(value) 来交换值。每个对该值感兴趣的组件都可以订阅该主题。
    示例:(取自RxJS docs

    //your Service
    import { Subject } from 'rxjs';
    const subject = new Subject<number>();
    
    //Component A (and others as well)
    service.subject.subscribe({
        next: (num) => console.log(num)
    });
    //this should work as well with prettier syntax:
    service.subject.subscribe(sum =>
        console.log(num)
    );
    
    //Component B
    service.subject.next(7) //passing number 7 to Component A
    

    每当您创建订阅时,请务必取消订阅!否则你可能会得到一堆订阅,它们都会在同一个组件中同时触发。

    根据个人经验,我发现如果可能的话,将任何可能被视为全局的函数和变量外包给专门的服务会更有帮助。如果您直接从组件中读取服务的变量(并在必要时对其进行修改),您将获得相同的效果。只要您保持适当的服务结构,它就可以工作。全球使用的专用服务的一些示例是:

    • 翻译 (TranslationService)
    • 权利管理 (PermissionService)

    【讨论】:

    • 在您的示例中,我能否将 service.subject.next(VALUE) 上的值发送到服务,然后发送到订阅的组件?
    • 没错,订阅是被触发的事件处理程序。因为我经常使用 Angular;我避免使用 Subjects 和 Observables,因为你很快就会失去概述。另一个问题是订阅不是单例的,每个实例都存在,直到你取消订阅......(subscription.unsubscribe())......这给我造成了一些重复处理事件的问题。
    猜你喜欢
    • 2013-05-31
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2019-01-21
    • 2012-01-23
    • 2017-05-06
    • 1970-01-01
    相关资源
    最近更新 更多