2017-11-07 16 views
5

Tôi đang làm việc cho dự án Angular 4. Tôi có một yêu cầu để phát hiện những thay đổi của mảng điều khiển biểu mẫu. ví dụ. Tôi có một mảng điều khiển biểu mẫu có tên là các nhà cung cấp, làm thế nào để phát hiện các thay đổi của nó?Làm thế nào để phát hiện các thay đổi trong mảng điều khiển biểu mẫu trong Angular 4?

export class CustomFormArray { 
public form: FormGroup; 

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

Bạn cần phải đăng ký thành phần bên trong mảng cung cấp như một nhóm khác để phát hiện nó. –

+0

bạn có thể giải thích nó không? –

+0

Yếu tố của các nhà cung cấp là gì? –

Trả lời

2

FormArray kéo dài AbstractControl vì vậy nó có valueChanges tài sản mà phát ra 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); 
}); 

Trong mẫu của bạn:

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

Các values trong đăng ký sẽ trả về một mảng với giá trị của từng lĩnh vực đầu vào khi bất kỳ thay đổi (về mặt ngữ pháp hoặc từ giao diện người dùng).

Trong trường hợp nếu có FormGroup trong FormArray không có thay đổi nào. chỉ cần sử dụng mã thành phần sau.

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

và mẫu sẽ là:

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

đây là plunker

+0

Tôi đã thử điều này. Nó hoạt động tốt trong trường hợp điều khiển biểu mẫu nhưng nó không phát hiện các thay đổi trong mảng điều khiển biểu mẫu. Có gì ngạc nhiên không? –

+0

Tôi cập nhật câu trả lời của tôi bây giờ 'valueChanges' là trên FormArray và nó làm việc hoàn toàn tốt đẹp. Bạn có thể giải thích thêm về vấn đề của mình – user1533603

+0

Có, tôi sẽ giải thích, tôi có một mảng kiểm soát biểu mẫu nhà cung cấp. vào thời gian chạy nó chứa một bản ghi của một nhà cung cấp trên chỉ mục 0. khi tôi thay đổi nhà cung cấp. Nó loại bỏ chỉ mục và tạo lại nó với chi tiết nhà cung cấp mới. Nhưng vấn đề của tôi là valueChanges không phát hiện những thay đổi trong mảng này. Tôi cũng đã thử mã cập nhật của bạn. Nhưng cùng một vấn đề tồn tại. –

0

Tương tự như cách bạn làm điều đó cho nhóm biểu mẫu thông thường. Bất cứ khi nào bạn khởi tạo nhóm biểu mẫu của mảng biểu mẫu của bạn, chỉ cần phát/thay đổi sự kiện thay đổi nhóm biểu mẫu của bạn trong mảng biểu mẫu của bạn.

đây là mẫu.

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

Tôi đã dùng thử. Nhưng valueChanges không hoạt động trong trường hợp mảng điều khiển biểu mẫu –

+0

nó sẽ hoạt động. tôi có thể biết nếu có bất kỳ ngoại lệ nào không? – i3lai3la

Các vấn đề liên quan