У меня есть электронное / угловое приложение, которое запускает внешние приложения, и я отслеживаю, запущены ли эти службы или нет, и показываю зеленые / красные индикаторы в нижнем колонтитуле, чтобы показать это. Я использую Electron IPC API для передачи информации о состоянии устройств от Electron до Angular. Это все работает, и я получаю испускаемые события, которые я могу слушать в Angular.
У меня есть служба, которая прослушивает обновления статуса IPC
this.electronService.ipcRenderer.on(IpcChannels.SERVICE_STATUSES_UPDATE, (event, { deviceStatus }) => {
// sending the new values through a private subject. There is a public
// observable for the subject which consumers use. This works, i
// receive updates when the services are stopped/started
this.deviceStatus.next(deviceStatus);
});
В моем шаблоне компонента
<span class="bottom-icon dot"
[ngClass]="{'inactive': !(deviceStatusService.deviceStatus$ | async)}"></span>
<span>{{'FooterBar.deviceLabel' | translate}}</span>
Вот где это терпит неудачу. Класс никогда не обновляется, чтобы иметь «неактивный» класс. Я возился с ним часами, прежде чем случайно обнаружил, что он действительно работает. Я полагаю, что Angular просто не выполняет повторную визуализацию и не получает изменения, потому что обнаружил, что с задержкой запуска служб, когда мое приложение отправляет сетевой запрос ПОСЛЕ изменения статуса, но до того, как оно вернется к исходному значению,угловая будет повторно визуализировать. и это действительно обновит. Но затем, после перезапуска службы, она снова не будет обновляться, пока что-то еще не сработает под углом.
У меня нет стратегии обнаружения изменений OnPush. Я попытался внедрить ChangeDetectionRef и отключить файл компонента, прослушивая наблюдаемые самостоятельно и запустив deteChanges () на ChangeDetectionRef.
Если я добавляю это в свой сервис при инициализации и просто вручную / случайно обновляю наблюдаемые, это фактическиработает мгновенно, но когда я переключаюсь на выдачу только новых значений из обработчика рендеринга ipc, то это не так.
interval(5000)
.subscribe(_ => {
this.posPrintStatus.next(Math.random() > .5 ? true : false);
this.cePosStatus.next(Math.random() > .5 ? true : false);
});
Я в недоумении, если это программная проблема или проблема обнаружения угловых изменений, которую я не понимаю.
Если есть какой-либо другой код / контексто том, что я могу предоставить, пожалуйста, дайте мне знать.