从SignalR在事件处理程序中访问属性时,属性始终未定义

时间:2018-10-24 08:19:49

标签: javascript asp.net angular signalr

我已经构建了一个角度应用程序,并且正在使用signalR来获取通知。

对于signalR东西,我已经安装了“ @ aspnet / signalr”:“ ^ 1.0.4”。

在Angular App中,我构建了一个服务来处理通过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 个答案:

答案 0 :(得分:1)

我对SignalR存储库进行了研究,而我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++;
    });
}