Представление не обновляется при получении сообщения IPC

Мой компонент правильно получает сообщение (как я мог видеть с помощью отладчика), но его представление не обновляется. Есть ли какие-либо ручные операции в прослушивателе IPC?

Это мой HTML-код компонента:

<div> {{text}} </div>

А это TypeScript:

 import { Component, OnInit } from '@angular/core';
 import { ipcRenderer } from 'electron'

 @Component({
   selector: 'app-receiver',
   templateUrl: './receiver.component.html',
   styleUrls: ['./receiver.component.scss']
 })
 export class ReceiverComponent implements OnInit {
   text: string;

 constructor() { }

 ngOnInit() {
  ipcRenderer.on('msg', function (event, arg){
    this.text=arg;
     })
   }
 }

Я ожидаю, что новая строка, которую страница получает от процесса Electron, будет отображаться на странице, но этого не происходит.

ipcRenderer, скорее всего, работает за пределами угловой зоны, или вы не можете правильно определить область видимости

mast3rd3mon 11.02.2019 12:59
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
1
343
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обработка событий IPC выполняется за пределами угловой зоны. Событие не является так называемым «обезьяньим патчем». Вы должны применить изменение внутри вызова ngZone.run. Кроме того, вы используете ключевое слово function, что приводит к изменению контекста this на эту функцию и больше не позволяет получить доступ к классу this. Используйте обозначение стрелки:

constructor(readonly nz: NgZone) { }

ngOnInit() {
  ipcRenderer.on('msg', (event, arg) => {
    this.nz.run(() => this.text = arg);
  });
}

Не забудьте «отменить прослушивание» для msg в ngOnDestroy, иначе вы активируете detectChanges для уничтоженной директивы, а angular это не нравится :)

использование стрелочных функций изменяет область видимости, а не зоны. для запуска в угловой зоне нужно импортировать ngZone а потом run() код и он будет в зоне

mast3rd3mon 11.02.2019 13:04

@ mast3rd3mon абсолютно прав, не знаю, почему я заставил его использовать changeDetector. Это сработает (я думаю), но это неправильный путь. Я обновил свой ответ, чтобы он работал наверняка. Спасибо за предупреждение

Poul Kruijt 11.02.2019 13:04

Другие вопросы по теме