首页 > 解决方案 > anugular 6同时从多个组件订阅主题不起作用

问题描述

我有两个组件(父级和子级)和一个服务,它们同时订阅了一个主题类。但是当主题类使用next方法发出数据时,只有一个组件(子组件)正在获取数据。

navbar.component.ts :(发件人):

this.messageService.setClientUserAuth(this.respObject.details.actionDtls);

message.service.ts:(订阅者)

constructor(private route: Router, private _rest: RestApiService) {
  this.getClientUserAuth().subscribe(auth => {
    console.log('AUTH :' + JSON.stringify(auth));
  });
}
setClientUserAuth(id: any) {
   this.clientUserAuth.next(id);
}

getClientUserAuth(): Observable<any> {
   this.clientUserAuth = new Subject<any>();
   return this.clientUserAuth.asObservable();
}

base-template.component.ts :(订阅者)(孩子)

ngOnInit() {

  this.messageService.getClientUserAuth().subscribe(auth => {
    console.log('------------>' + JSON.stringify(auth));
  });
}

action.component.ts(订阅者)(父级)

constructor(private _rest: RestApiService, private messageService: MessageService,
          private route: Router, private modalService: NgbModal, notifier: NotifierService) {
this.messageService.getClientUserAuth().subscribe(auth => {
  console.log('----::----->' + JSON.stringify(auth));
});
}

当数据来自导航栏组件时,只有基本模板subscription函数获取数据,但是如果我subscription从基本模板中删除方法,则subscription操作组件中的方法获取它。但是我希望所有组件和服务中的数据同时呈现,因为它们都同时呈现。如何实现这一点。

标签: angularsubject-observer

解决方案


修改您的服务方法,从方法“getClientUserAuth()”中删除主题的初始化,在定义它的位置初始化您的 observable(也可能是您希望将其设为私有):

private _clientUserAuth = new Subject<any>();
getClientUserAuth(): Observable<any> {
   return this._clientUserAuth.asObservable();
}

setClientUserAuth(id: any) {
   this._clientUserAuth.next(id);
}

每次任何组件调用 subscribe 的返回时getClientUserAuth(),您最终都会创建一个新主题。


推荐阅读