在 SignalR 的事件处理程序中访问属性时始终未定义
Posted
技术标签:
【中文标题】在 SignalR 的事件处理程序中访问属性时始终未定义【英文标题】:Property always undefined when accessing it in Event Handler from SignalR 【发布时间】:2019-03-28 13:55:28 【问题描述】:我已经构建了一个 Angular 应用程序,并且我正在使用 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:
好的,我可以使用它了 this solution
诀窍是绑定 eventHandler。
尽管如此,我会接受答案,因为它在我给定的示例中有效,并为我指明了正确的方向。
【问题讨论】:
【参考方案1】:我研究了 SignalR repo,我 found:
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++;
);
【讨论】:
以上是关于在 SignalR 的事件处理程序中访问属性时始终未定义的主要内容,如果未能解决你的问题,请参考以下文章
在 dragstart 事件处理程序中 event.dataTransfer 和 event.originalEvent 始终为 null
使用DBContext ChangeTracker编写基于事件的SignalR Notification Service - 关注点分离