У меня есть несколько Angular
компонентов, которые подписываются на SignalR
концентраторное соединение. Я обернул объект соединения концентратора SignalR
с угловой службой, hubconnection.service.ts
:
import { Injectable } from '@angular/core';
import { HubConnectionBuilder, HubConnection } from '@aspnet/signalr';
@Injectable()
export class HubConnectionService {
public MyHubConnection: HubConnection;
constructor() {
this.MyHubConnection = new HubConnectionBuilder()
.withUrl('/sensorHub')
.build();
this.MyHubConnection
.start()
.then(() => console.log('[HubConnectionService] Connection started'))
.catch(err => console.log('[HubConnectionService] Error while starting connection: ' + err));
}
}
Теперь у меня есть компонент, из которого я хочу подписаться на данные, полученные через хаб SignalR
, для этого я импортирую свою оболочку SignalR
, а в конструкторе я вызываю метод .on()
. Чтобы отписаться от этого события, я вызываю метод .off()
в деструкторе:
export class RawdataComponent implements OnInit {
constructor(private hubConnectionService: HubConnectionService) { }
ngOnDestroy() {
this.hubConnectionService.MyHubConnection.off('Broadcast');
}
ngOnInit() {
this.hubConnectionService.MyHubConnection.on('Broadcast',
function(sender, message) {
console.log('New message received: ' + message);
});
}
}
Когда я вначале захожу на страницу, которая описывается этим компонентом, все работает как положено (console.log()
регистрирует каждое полученное сообщение).
Когда я покидаю страницу, вызывается MyHubConnection.off('Broadcast');
. Затем, после того как я снова получаю доступ к предыдущей странице, вызывается конструктор и делается другая подписка, но предыдущая не закрывается, и я получаю два console.log()
вызова.
Где ошибка, которую я делаю? Разве MyHubConnection.off('Broadcast');
не должен закрывать текущую подписку, когда я покидаю страницу?