【问题标题】:angular2 broadcasting event from service to all components using that serviceangular2 将事件从服务广播到使用该服务的所有组件
【发布时间】:2017-12-23 17:16:36
【问题描述】:

我正在尝试使用 angular2 中的“主题”类将事件作为可观察对象广播,从服务到其中包含该服务实例的所有组件。

在我的服务中,我有以下几点:

private loggedIn = new Subject<boolean>();

isUserLoggedIn(): Observable<boolean> 
{
    return this.loggedIn.asObservable();
}

test() 
{
  this.loggedIn.next(true);
}

然后在使用此服务的组件中,我有(_auth 与上面定义的服务相同):

ngOnInit()
    {
        console.log("yay!");
        this._auth.isUserLoggedIn()
            .subscribe(
                d => {
                    console.log(d);
                },
                d => {
                    console.log(d);
                },
                () => {
                    console.log("Done!");
                }
            );
    }

现在的问题是,如果我在同一个组件中调用服务的方法this._auth.test();,一切正常,console.log 行将在此组件中执行。但是,如果从另一个组件调用服务的方法,则不会触发该组件来运行 console.log 行。

即使服务的方法被另一个组件触发,如何确保该组件中的代码运行? (假设两个组件同时渲染)。

谢谢!

【问题讨论】:

    标签: angular rxjs angular2-services angular2-components angular2-observables


    【解决方案1】:

    不在每个组件上提供服务,只在

    中提供
    @NgModule({ 
      providers: MySharedService, 
      ...
    })
    export class AppModule {}
    

    否则会为每个组件(为每个提供者)创建一个新的服务实例

    【讨论】:

    • 我已经这样做了。共享服务仅在 AppModule 中提供,其他任何地方都没有。
    • 那么我唯一能想象的是,组件仅在发送事件之后订阅。您可以尝试使用BehaviorSubject 而不是Subject 进行验证。
    • 你能详细说明一下 BehaviourSubject 吗?
    • BehaviorSubject 记住最后发出的事件并立即将该值发送给新的订阅者。这样,在事件发出后订阅的订阅者也会收到该事件。
    • stackoverflow.com/questions/36701041/…。是的,只需替换Subject
    猜你喜欢
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多