Angular 当我收到web套接字消息时,所有注入的服务都未定义
我在两侧实现了websocket(后端和前端) 我从后端接收消息 问题是我想在MatDialog或ToAstr中显示收到的消息。他们两个都没有定义 下面是我的组件代码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
@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谢谢,我应该把调用函数改成箭头函数