web-dev-qa-db-fra.com

Angular mettre à jour manuellement ngModel et définir le formulaire sur sale ou invalide?

J'ai un formulaire et un modèle sous-jacent comme celui-ci

À partir de composant

myTextModel: string;
updateMyTextModel(): void {
    this.myTextModel = "updated model value";
    //todo- set form dirty (or invalid or touched) here
}

Modèle html

<form #testForm="ngForm" id="testForm">
  <input type="text" id="myText" [(ngModel)]="myTextModel" name="myText" #myText="ngModel">
</form>
<button (click)="updateMyTextModel()">Update myTextModel</button>
<div *ngIf="testForm.dirty">testForm diry</div>
<div *ngIf="testForm.touched">testForm touched</div>

Comment définir le formulaire touché ou modifié par le code?

Remarque: dans cet exemple, j'utilise un bouton pour déclencher le changement de modèle, mais je peux également mettre à jour le modèle de différentes manières, par exemple dans un rappel depuis une demande Web api async.

4
Toby

Solution:

//our root app component
import {Component, NgModule, VERSION} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { Component, ViewChild } from '@angular/core';
import { FormsModule }   from '@angular/forms';

@Component({
  selector: 'my-app',
  template: `
    <form #testForm="ngForm" id="testForm">
        <input type="text" id="myText" [(ngModel)]="myTextModel" name="myText" #myText="ngModel">
    </form>
    <button (click)="updateMyTextModel()">Update myTextModel</button>
    <div *ngIf="testForm.dirty">testForm diry</div>
    <div *ngIf="testForm.touched">testForm touched</div>
  `,
})
export class App {

  @ViewChild('testForm') test: any;

  updateMyTextModel(){
    this.test.control.markAsTouched();
    this.test.control.markAsDirty();

  }

  constructor() {
    console.log(this.test);
  }
}

@NgModule({
  imports: [ BrowserModule,FormsModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

Plunkr fonctionne:

https://plnkr.co/edit/YthHCEp6iTfGPVcNr0JF?p=preview

6

Pourquoi ne pas utiliser les formulaires réactifs (FormGroup),

let testForm = new FormGroup({
    myText: new FormControl('initial value')
})

<form [formGroup]="testForm">
    <input type="text" formControlName="myText">
</form>

<button (click)="updateMyTextModel()">Update myTextModel</button>
<div *ngIf="testForm.dirty">testForm diry</div>
<div *ngIf="testForm.touched">testForm touched</div>

Dans votre fonction, vous pouvez utiliser markAsDirty() selon la condition de votre choix.

updateMyTextModel(): void {
    this.myTextModel = "updated model value";
    if ( // some condition ) {
        this.testForm.markAsDirty();
    }
}

Pour définir des contrôles de formulaire individuels comme étant sales/touchés, vous pouvez utiliser

this.testForm.get('myText').markAsDirty();
this.testForm.get('myText').markAsTouched();
3
cyberpirate92

Cela devrait fonctionner:

@ViewChild('testForm') testForm;


updateMyTextModel(): void {
    this.myTextModel = "updated model value";
    this.myForm.form.markAsDirty();
}
1
Riscie