Скажем, у меня есть function noificationHandler()
в моем service.ts, который находится вне контекста angular.
noificationHandler()
вызывается третьей стороной, а noificationHandler()
в основном потребляет массив и испускает массив компонентам, которые подписались на его службу.
service.ts
public mySubject: Subject<any> = new Subject();
public myObservable = this.mySubject.asObservable();
constructor() {
this.registry.subscribe("notification.msg",this.noificationHandler.bind(this));
}
noificationHandler(data) {
this.publishUpdate(data)
}
publishUpdate(data) {
this.mySubject.next(data);
}
component.ts
constructor(private service: myService) {
this.service.myObservable.subscribe(list => {
this.list = list;
});
}
^^^ в этот момент шаблон не обновляется новыми данными
Так как "notification.msg"
находится вне зоны angular, angular
s изменение не запускается, когда вызывается это событие ("notification.msg")
.
Теперь есть два способа вызвать обнаружение изменений.
1) Обернув noificationHandler()
внутри angular zone.run()
this.registry.subscribe("a2mevent.notification.msg", this.ngZone.run(() => this.noificationHandler.bind(this)));
2) путем индивидуального запроса компонента на обнаружение изменений
constructor(private service: myService, private ref: ChangeDetectorRef) {
this.service.myObservable.subscribe(list => {
this.list = list;
this.ref.detectChanges(); // <==== manually invoking change detection
});
}
Оба варианта работают! И моя структура компонента выглядит следующим образом
A --> root component
B
C
D // my component is here (4 levels of nesting)
Вопросы -
1) Будет ли обнаружение изменений() обнаруживать изменения только для своих собственных компонентов или будет также запускать обнаружение изменений на дочерних компонентах?
2) будет zone.run() инициировать обнаружение изменений всех компонентов от корня до листа?
Среди zone.run() и detectChanges() Мне интересно, что лучше в производительности?