angular - ngIf observerer ikke variabelendring
Følgende er et HTML-kodeutdrag hvor ngIf sjekker om forceAngle er sann; som standard er forceAngle falsk. Når knappen klikkes, kaller jeg ForceAngles()-funksjonen og setter forceAngle til sann. Problemet er at når den er satt til sann, bør ngIf sjekke statusen og vise riktig mal. Akkurat nå får jeg ikke endringene som forventet. Jeg er ny på dette området og har surfet i flere timer på internett for å finne en ordentlig løsning. Jeg tror jeg har gått glipp av et grunnleggende Angular-prinsipp. Trenger ekspertstøtte på dette.
<ng-container matColumnDef="AssemblyAngle">
<mat-header-cell *matHeaderCellDef [ngClass]='txt-wrapper'> Assembly Angles</mat-header-cell>
<div *ngIf="forceAngle == 'true' ; else inputtemplate;">
<mat-cell *matCellDef="let element">
<span class="txt-inner">{{forceAngle}}</span>
</mat-cell>
</div>
<ng-template #inputtemplate>
<mat-cell *matCellDef="let element" class="txt-wrapper mat-header-cell">
abc
</mat-cell>
</ng-template>
</ng-container>
<button class="btn-secondary" (click)="ForceAngles()">Force Angles</button>
.ts-fil
ForceAngles() {
this.forceAngle = 'true';
this.loadCompressorOptimizeData();
console.log(this.forceAngle);
return this.forceAngle;
}
Svar #1
Problemet er at ingenting utløser Angulars endringsdeteksjon-mekanisme. Du har to måter å løse det på:
Den første
Implementer en mekanisme som vil utløse endringsdeteksjon ved å bruke tick()-metoden fra ApplicationRef-klassen:
import {ApplicationRef } from '@angular/core';
export class Component {
constructor(private ref: ApplicationRef) {}
ForceAngles() {
this.forceAngle = 'true';
this.loadCompressorOptimizeData();
console.log(this.forceAngle);
this.ref.tick();
return this.forceAngle;
}
}
Ta en titt på dette svaret for mer informasjon: Utløse oppdatering av komponentvisning fra tjeneste - Ingen leverandør for ChangeDetectorRef
En til
Bruk observable som forceAngle-type, og async-pipe i malen din (async-pipe utløser endringsdeteksjon automatisk når en ny verdi blir pushet til observable).
Eksempel .ts:
export class Component {
forceAngle: Subject<boolean> = new Subject();
someMethod(): void {
this.forceAngle.next(true);
}
}
og mal:
<div *ngIf="(forceAngle | async) == true">some div</div>
Her kan du finne en fin artikkel om endringsdeteksjon i Angular: https://blog.thoughtram.io/angular/2016/02/22/angular-2-change-detection-explained.html
