我正在尝试将authguard组件中的事件广播到我的标头组件 .
广播服务
@Injectable()
export class BroadcastService {
public subject = new Subject<any>();
sendMessage(message: string) {
this.subject.next(message);
}
}
接收器( Headers 组件)
export class HeaderComponent {
constructor(public broadcast: BroadcastService) {
this.broadcast.subject.subscribe(message => {
alert('broadcast received: ' + message);
});
}
}
广播(authguard组件 - 不起作用)
export class AuthGuard implements CanActivate {
constructor(public broadcast: BroadcastService) {
}
canActivate(): boolean {
this.broadcast.sendMessage('Hi from AuthGuard');
return true;
}
}
广播(仪表板组件 - 工作)
export class DashbardComponent {
constructor(public broadcast: BroadcastService) {
}
ngOnInit() {
this.broadcast.sendMessage('Hi from AppComponent');
}
}
app.component.html
<headerComponent></headerComponent>
<router-outlet></router-outlet>
路由
{
path: 'dashboard',
component: DashboardComponent,
canActivate: [AuthGuard]
}
问题是,当我从我的authguard组件广播时,我的标头组件中的接收器永远不会收到该消息 . 我可以确认每个路径都会调用authGuard中的canActivate方法 .
但是当我从页面组件(例如仪表板)广播时,标头组件中的接收器确实接收到该消息 .
有谁知道如何从authguard发布消息到我的 Headers 组件?
2 回答
你必须使用 BehaviorSubject
这是一个例子
boradcast.service.ts
这是Stackblitz演示
请使用BehaviorSubject而不是Subject
BehaviorSubject包含一个值 . 订阅时,它会立即发出值 . 主题没有值 .
请检查https://stackoverflow.com/a/43351340/2742156
订阅者始终接收最后发布的值
更新:
Guard
broadcast service
subscriber(header component)
route config