2017-11-07 28 views
5

Pracuję nad projektem Angular 4. Mam wymóg wykrywania zmian w macierzy kontroli formularzy. na przykład Mam tablicę kontroli formularzy o nazwie provider, jak wykrywać jej zmiany?Jak wykrywać zmiany w tablicy kontrolnej formularza w Angular 4?

export class CustomFormArray { 
public form: FormGroup; 

constructor(private _fb: FormBuilder) { 
     this.form = _fb.group({ 
      providers: _fb.array([]) 
     }); 
    } 
} 
+0

Musisz zarejestrować element wewnątrz dostawców tablicy jako inną grupą w celu jej wykrycia. –

+0

Czy możesz to wyjaśnić? –

+0

Jaki jest element dostawców? –

Odpowiedz

2

FormArray rozciąga AbstractControl więc ma valueChanges właściwość, która emituje Chanes.

this.form = this.fb.group({ 
    providers: this.fb.array([]), 
}); 
(this.form.get('providers') as FormArray).push(new FormControl('', Validators.required)); 
(this.form.get('providers') as FormArray).push(new FormControl('', Validators.required)); 

(this.form.get('providers') as FormArray).valueChanges.subscribe(values => { 
    console.log(values); 
}); 

W szablonie:

<input *ngFor="let field of form.controls.providers.controls;" [formControl]="field"> 

values w subskrybować zwróci tablicę z wartości każdego pola wejściowego gdy którykolwiek zmian (gramatycznie lub UI).

W przypadku, gdy są FormGroup w FormArray nic się nie zmienia. po prostu użyj następującego kodu komponentu.

(this.form.get('providers') as FormArray).push(this.fb.group({ 
     'name': '', 
     'age': '' 
    })); 

i szablon będzie:

<div *ngFor="let field of form.controls.providers.controls;" [formGroup]="field"> 
    <input formControlName="name" placeholder="name"> 
    <input formControlName="age" placeholder="age"> 
</div> 

tutaj jest plunker

+0

Próbowałem tego. Działa to dobrze w przypadku kontroli form, ale nie wykrywa zmian w tablicy formantów formularzy. Jestem zaskoczony, dlaczego? –

+0

Zaktualizowałem teraz odpowiedź 'valueChanges' na FormArray i działa doskonale. Czy mógłbyś wyjaśnić więcej o swoim problemie? – user1533603

+0

Tak, wyjaśnię, mam tablicę kontrolną dostawców. w czasie wykonywania zawiera rekord dostawcy na indeksie 0., gdy zmieniam dostawcę. Usuwa indeks i odtwarza go z nowym szczegółem dostawcy. Ale moim problemem jest to, że valueChanges nie wykrywa zmian w tej tablicy. Próbowałem również Twojego zaktualizowanego kodu. Ale ten sam problem istnieje. –

0

Jest podobny, jak w przypadku zwykłej grupy formularzy. Za każdym razem, gdy inicjujesz grupę formularzy w swojej macierzy, po prostu wyślij/zapisz zmiany w swojej grupie formularzy.

tutaj jest próbka.

export class CustomFormArray { 
    public form: FormGroup; 

    constructor(private _fb: FormBuilder) { 
      this.form = _fb.group({ 
       providers: _fb.array([]) 
      }); 

     this.providers.push(this.createprovidersFormGroup()) 
     } 

    createprovidersFormGroup(){ 
      let form = this._formBuilder.group({ 
         abc: "abc" 


        }); 

       form.valueChanges.subscribe(data => { 
        console.log('Form changes', data) 
       }); 

     return form; 
     } 
+0

Już to wypróbowałem. Ale valueChanges nie działa w przypadku tablicy kontroli formularza –

+0

powinno działać. czy mogę wiedzieć, czy jest jakiś wyjątek? – i3lai3la