Angular 当我收到web套接字消息时,所有注入的服务都未定义

Angular 当我收到web套接字消息时,所有注入的服务都未定义,angular,dependency-injection,websocket,angular-material,Angular,Dependency Injection,Websocket,Angular Material,我在两侧实现了websocket(后端和前端) 我从后端接收消息 问题是我想在MatDialog或ToAstr中显示收到的消息。他们两个都没有定义 下面是我的组件代码 @Component({ selector: 'app-upload-excel-file', templateUrl: './upload-excel-file.component.html', styleUrls: ['./upload-excel-file.component.scss'] }) export clas

我在两侧实现了websocket(后端和前端) 我从后端接收消息 问题是我想在MatDialog或ToAstr中显示收到的消息。他们两个都没有定义 下面是我的组件代码

@Component({
 selector: 'app-upload-excel-file',
 templateUrl: './upload-excel-file.component.html',
 styleUrls: ['./upload-excel-file.component.scss']
})
export class UploadExcelFileComponent implements OnInit {

  constructor(

    private websocketService: UploadWebsocketService,
    private toastr: ToastrService,
    private dialog: MatDialog
  ) {}

  ngOnInit() {
    this.connect();
  }
  connect() {
    const obs = this.websocketService.getObservable();
    obs.subscribe(
      this.onMessageReceived,
      (err) => console.log(err)
    );
  } 
  public onMessageReceived(receivedMsg) {
    if (receivedMsg && receivedMsg.type === 'SUCCESS') {
    /* Todo update notification icon */
    const res = receivedMsg.message;
    this.toastr.info(res.success, 'result');
    this.dialog.open(ListDialogComponent, {
      closeOnNavigation: false,
      disableClose: true,
      data: res
    }).afterClosed().subscribe();
   }
  }
 }

在组件初始化时,所有组件都可以正常工作,但当我在websocket中收到消息时,我有一个错误,即未定义的服务中的服务,我只是将此.onMessageReceived更改为arrow函数,它对我起作用。

当您订阅observable时,此问题与您的
下一次
回调有关。当您说
this.onMessageReceived
时,您正在将引用传递给函数
onMessageReceived
。以这种方式传递函数时,会丢失
this
。如果要在
onMessageReceived
中打印
this
,您会注意到
this
现在正是您所期望的

现在有两种解决方案。一个简单的方法是只使用箭头函数作为订阅中的
下一个
回调函数

const obs=this.websocketService.getObservable();
订阅(
(receivedMsg)=>this.onMessageReceived(receivedMsg),
(err)=>console.log(err)
);
或者,您可以选择将适当的
this
绑定到构造函数中的
onMessageReceived
函数

export类UploadExcelFileComponent实现OnInit{
建造师(
私有websocketService:UploadWebsocketService,
私人toastr:ToastrService,
私人对话:MatDialog
) {
//把你的包绑在这
this.onMessageReceived=this.onMessageReceived.bind(this);
}
}

而不是
this.onMessageReceived
对于您的
下一个
回调,使用箭头函数
(receivedMsg)=>this.onMessageReceived(receivedMessage)
它们变得未定义是什么意思?他们以前在哪里定义的?@Sajad是的,当然,我在onInit函数中添加了一个console.log,这两个对象都是defined@JasonWhite谢谢,我应该把调用函数改成箭头函数