从无视图的组件中触发自定义事件

时间:2019-10-14 19:55:55

标签: angular

我希望能够触发其他组件可以订阅的自定义事件,我读到的并不是我想要的,我不希望触发html元素上的任何视图或用户交互我的活动。

如果我的组件具有注销方法:

logout() : void {
    // change local storage state

    // fire event so other components can update
}

我希望该方法触发其他组件可以订阅的自定义事件,以便他们知道对注销做出反应。

所以另一个组件可能有一个方法:

something() : void{

    // subscribe the event here and perform some local action, like changing a login state variable
}

我确定我在使用Ionic而不是纯角钢之前已经做到了这一点...

1 个答案:

答案 0 :(得分:1)

我相信在Angular中这种模式的最佳方法是使用服务公开Observable。类似于(例如,在AuthenticationService中):

private loginStatusSource$ = new BehaviorSubject();

public loginStatus$ = this.loginStatusSource$.asObservable();

...

logout() : void {
    // change local storage state

   this.loginStatusSource$.next(false);
}

getLoginStatus(): Observable<boolean> {
  return this.loginStatus$;
}

然后在您的组件中

public loginStatus$: Observable<boolean>;

constructor(private authService: AuthenticationService) {
  this.loginStatus$ = this.authService.getLoginStatus();
}

something() : void{
  this.loginStatus$.subscribe(status => {
    // perform some local action...
  });
}

请注意,这是一个简化的示例,您可能希望存储的不仅是布尔值,还包括用户数据之类的东西。可以使用诸如NGRXAkita之类的状态管理工具,但这是更简单的方法,不需要使用其他依赖项。