angular2广播事件从服务到使用该服务的所有组件

时间:2017-07-18 17:32:08

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

我正在尝试使用"主题" 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行。

即使服务的方法是由另一个组件触发,如何确保此组件中的代码运行? (假设两个组件同时呈现)。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

<tr *ngFor="let this_user of RoleUsers.Users">
  ...
  <th scope="row" *ngIf="UsersToRemove.InAction">
    <label class="custom-control custom-checkbox mb-2 mr-sm-2 mb-sm-0">
      <input type="checkbox" class="custom-control-input" (change)="AddOrRemoveUser (this_user, $event.target.checked)" /> <!--[(ngModel)]="" --> <!-- ng-false-value="expression"-->
      <span class="custom-control-indicator"></span>
    </label>
  </th>
  ...
</tr>

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