typescript - Angular-setter blir ikke kalt med samme verdi


Jeg har et veldig enkelt skjema (med tre felter) som oppdaterer en konfigurering. Når jeg klikker på oppdater-knappen, vil jeg at en suksessmelding skal vises og forsvinne etter 5 sekunder. Når send-knappen er klikket (konfigurasjonen oppdatert), hvis skjemaet sendes inn igjen før den forrige meldingen har forsvunnet, vil jeg at de forrige 5 sekundene skal ignoreres og at suksessmeldingen skal vises i de neste 5 sekundene.

Jeg prøvde å oppnå det ved å:

<div *ngIf="message">
  {{ message }}
</div>

Og :

_message: string;
_timeout: number;

get message() {
  return this._message;
}

@Input()
set message(value: string) {
  if (value) {
    if (this._timeout) {
      clearTimeout(this._timeout);
    }
    this._timeout = setTimeout(function() {
      this.message = null;
    }.bind(this), 5000);
  }
  this._message = value;
}

Jeg setter en melding når sendeknappen klikkes. Så meldingen vises og forsvinner etter 5 sekunder. Men set-metoden blir ikke kalt når jeg prøver å oppdatere konfigurasjonen igjen fordi meldingen alltid er den samme - "Success". Har du noen idé om hvordan man kan oppnå dette?

Svar #1

Problemet er knyttet til Angulars endringsdeteksjonsmekanisme. Ved andre innsending, hvis det ikke er noen endringer, er skjemaet fortsatt merket som urørt og innsendingen har ingen effekt.

En løsning er å legge til en klikkerlytter som eksplisitt kaller en funksjon for å sette meldingen.

<input type="submit" (click)="displayMessage()" />

Svar #2

Vennligst sjekk denne koden. Jeg er ikke sikker på å sjekke ryddet _timeout med "if".

_message : string; _timeout: number;   

get message() {
  return this._message;
}

@Input()
set message(value: string) {
  if (value && this._timeout == -1) {        
    this._timeout = setTimeout(function () {
      clearTimeout(this._timeout);
      this.message = null;
    }.bind(this), 5000);

    this._message = value;
  }
}