我已经构建了一个角度应用程序,并且正在使用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。
尽管如此,我还是会接受答案的,因为它在给定的示例中有效并且为我指明了正确的方向。
答案 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++;
});
}