Повторная инициализация приложения Angular для определенного события: Angular 5 - PullRequest
0 голосов
/ 29 октября 2018

Я использую Angular 5 для создания веб-приложения и хотел бы знать, могу ли я повторно инициализировать все приложение ИЛИ использовать что-то вроде:

ApplicationRef.tick();

для выполнения всех изменений, которые происходят после определенного события. Мой сценарий - это обновление токена аутентификации, потому что по какой-то причине обнаружение изменений моего приложения перестает работать, если я не запускаю каждое действие внутри

NgZone.run()

(я использую ADAL для аутентификации на случай, если кому-то это интересно), но когда токен обновляется (с использованием скрытого iframe), обнаружение изменений в маршрутизации, маршрутизация и т. Д. Начинают нарушаться. Но когда страница обновляется, она начинает работать отлично, пока не истечет следующий токен, и ADAL должен создать iFrame для обновления токена. Поэтому я подумал, могу ли я хотя бы повторно инициализировать приложение после обновления токена, чтобы пользователю не приходилось обновлять приложение вручную (пока я не найду более надежное решение).

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете вызвать обнаружение изменений явно, как показано ниже.

 constructor(private changeDetector: ChangeDetectorRef) {

    this.someEvents.subscribe((data) => {

    this.changeDetector.detectChanges();
   } );
}

https://angular.io/api/core/ChangeDetectorRef

0 голосов
/ 29 октября 2018

Это обязательно, если вы вызываете какой-либо сторонний API или выполняете сторонние библиотечные коды. Нам нужно вручную вызвать ngzone.run (), который внутренне вызовет ApplicationRef.tick (), чтобы уведомить angular о необходимости обнаружения изменений от корневого компонента приложения до дочернего компонента (то есть всего приложения).

ngZone.run(()=>{
  // Adal callback Function
});

Если вам нужно активировать обнаружение изменений только для текущего компонента и его дочерних элементов (а не для всего приложения). Вы можете использовать любой вариант.

1) setTimeout(()=>{}, 0);

2) this.cdr.detectChanges();

3) For Components with OnPush Change Detection Stratergy, you can call this.cdr.markForCheck() inside setTimeout();

   setTimeout(()=>{
     this.cdr.markForCheck();
   }, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...