Не удается получить представление для обновления с использованием наблюдаемых с привязкой ngClass - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть электронное / угловое приложение, которое запускает внешние приложения, и я отслеживаю, запущены ли эти службы или нет, и показываю зеленые / красные индикаторы в нижнем колонтитуле, чтобы показать это. Я использую 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);
  });

Я в недоумении, если это программная проблема или проблема обнаружения угловых изменений, которую я не понимаю.

Если есть какой-либо другой код / ​​контексто том, что я могу предоставить, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 03 ноября 2019

Ответ был довольно прост, но я никогда не сталкивался с проблемой и никогда не думал об этом.

Это произошло потому, что связь IPC происходила за пределами угловой зоны. Мне пришлось добавить экземпляр NgZone в мой сервис и использовать NgZone.run (), чтобы обновить наблюдаемые значения в угловой зоне.

...