javascript - 在 SignalR 的事件处理程序中访问属性时始终未定义
问题描述
我已经构建了一个角度应用程序,并且正在使用 signalR 来获取通知。
对于 signalR 的东西,我已经安装了“@aspnet/signalr”:“^1.0.4”。
在 Angular 应用程序中,我构建了一个服务来处理通过 signalR 发送的所有通知:
private _hubConnection: HubConnection;
numberX: number = 0;
constructor() {
this.createConnection();
this.registerOnServerEvents();
this.startConnection();
}
private createConnection() {
this._hubConnection = new HubConnectionBuilder().withUrl(someURL).build();
}
private startConnection(): void {
this._hubConnection.start();
}
private registerOnServerEvents(): void {
this._hubConnection.on('Notify', (data: any) => {
this.numberX++;
});
}
当我从 signalR 获得事件时,实际上调用了事件处理程序,当我向控制台输出发送某些内容时,它实际上被写入控制台。
但是当我尝试访问成员属性(在本例中为 numberX)时,我总是收到一个异常,告诉我 numberX 未定义,即使我在一开始就定义了它。
这可能是某种范围的事情吗?
编辑: Kenzk447 的解决方案实际上适用于我给定的场景。但是,当我更进一步,不仅增加数字,而且使用可由组件使用的 EventEmitter 时,这将不起作用:
在服务中:
someEvent: EventEmitter<any> = new EventEmitter();
private registerOnServerEvents(): void {
const $self = this;
this._hubConnection.on('ErrorMessage', (data: any) => {
$self.someEvent.emit(data);
});
}
在组件中:
notificationCount: number = 0;
this.notificationService.someEvent.subscribe(this.onSomeEvent);
onSomeEvent(data: any) {
this.notificationCount++;
}
执行此操作时,组件中的“this”未定义,我无法访问组件的属性。
编辑2:
好的,我可以使用 此解决方案
诀窍是绑定 eventHandler。
尽管如此,我会接受答案,因为它在我给定的示例中有效,并为我指明了正确的方向。
解决方案
我对 SignalR repo 进行了研究,发现:
methods.forEach((m) => m.apply(this, invocationMessage.arguments));
问题在这里:m.apply(this,...
,SignalR 试图将“this”作为 HubConnection 类实例。所以,我的解决方案:
private registerOnServerEvents(): void {
const $self = this;
this._hubConnection.on('Notify', (data: any) => {
$self.numberX++;
});
}
推荐阅读
- iis - 如何在 IIS 中发布 aurelia 项目
- react-native - 反应本机自定义互联网电话
- android - Android Firebase 用户更新之间的持久性
- ocaml - 致命错误:异常 Graphics.Graphic_failure("Cannot open display")
- visual-studio-code - VSCode 自定义窗口边框
- java - 帮助小学生学习乘法的写作程序
- flutter - 如何让 Flutter GoogleMap initialCameraPosition 显示用户的当前位置?
- angular - 类不是 Angular 模块 - 仅在导入本地构建 Angular 库时在 IntelliJ/Webstorm 中
- spring-boot - 如何使用 liquibase 回滚数据库
- c# - 无法设置 MQL_DLLS_ALLOWED