Угловой 7: ChangeDetectorRef detectChanges() вызывает бесконечный цикл при вызове изнутри подписки
Я публикую здесь после прочтения всех материалов, связанных с обнаружением изменений и аналогичной публикацией, и не могу решить мою проблему.
ChangeDetectorRef detectChanges()
вызывает бесконечный цикл при вызове изнутри подписки. Если я не позвоню detectChanges
, Я получил ExpressionChangedAfterCheck
ошибка. Я серьезно не знаю, как решить, и почему ExpressionChangedAfterCheck
ошибка приходит
ngAfterViewInit() {
this.route.params.subscribe((params) => {
this.userId = params.userId;
if (this.userId != undefined) {
this.loadActivity();
}
else {
alert("Userid not supplied");
}
this.cdRef.detectChanges();
});
}
loadActivity() {
while(this.layers.length > 0){
this.layers.pop();
}
this.loading = true;
this.userService.authenticatedGet(ApiUrls.GetLocation(this.userId, this.activity.from.getTime(), this.activity.to.getTime()), {}).subscribe(
(res:any) => {
this.user = res.user;
this.loading = false;
// other logic
this.cdRef.detectChanges();
console.log("Loading is " + this.loading);
}
);
}
Примечание. Эта проблема возникает только тогда, когда значение связано с ngIf
,
1 ответ
Я решил это. Проблема была не с жизненным циклом, а с директивой leaflet
из проекта листовки ngx.
Когда я удалил директиву и привязки, связанные с листовкой, все ошибки исчезли.
Ошибка пришла даже с этим:
<ng-container *ngIf="!loading">
<div
class="map"
leaflet
(leafletMapReady)="onMapReady($event)"
[leafletOptions]="options"
[leafletLayers]="layers"
[leafletLayersControl]="layersControl">
</div>
</ng-container>
Я попытался добавить Detechanges и MarkForCheck поочередно, но снова не повезло.
onMapReady(map: Map) {
this.map = map;
setTimeout(() => map.invalidateSize(), 1000);
this.route.params.subscribe(params => {
this.userId = params["userId"];
this.loadActivity();
});
this.cdRef.markForCheck();
}
Наконец, я оставил листок, когда писал этот ответ, и собираюсь попробовать Angular-Google-Maps.
И да, AGM работает нормально.