2017-05-31 25 views
6

Tôi có hình thức phản ứng như vậy:góc 4: setValue formBuilder trống mảng

constructor(...){ 
    this.form = this.formBuilder.group({ 
    name: ['', Validators.compose([Validators.required, Validators.maxLength(50)])], 
    memes: this.formBuilder.array([ 
     this.initMemes('TrollFace') 
    ]) 
    }); 
} 

initMemes (name?) { 
    return this.formBuilder.group({ 
    id: [''], name: [name] 
    }); 
} 

sau tôi có thể thêm một số chi tiết memes:

addMemes() { 
    const control = <FormArray>this.form.controls['memes']; 
    control.push(this.initMemes('anyName')); 
} 

và sau đó nếu tôi nhận được giá trị hình thức tôi nhận được:

this.form.controls['memes'].value - ở đây tôi có mảng

Nhưng có một trường hợp, khi tôi cần số này this.form.controls['memes'].value để đặt thành một mảng trống, bạn có thể làm như thế nào?

Nếu tôi đặt nó theo cách này:

this.form.controls['memes'].setValue([])

tôi đã nhận lỗi: Must supply a value for form control at index: 0.

những gì tôi làm sai?

Trả lời

5

thử một vài điều: reset(), setControl(), nhưng sau đây là giải pháp duy nhất tôi tìm thấy để làm việc mà thực sự reset toàn bộ mảng để [], lựa chọn khác làm việc, nhưng họ rời formgroups tại chỗ, chỉ làm trống các giá trị.

Vì vậy, làm thế nào tôi đã nhận nó để làm việc, đã lặp đi lặp lại các mảng hình thức và xóa từng nhóm mẫu với chỉ số đặc biệt trong vòng lặp:

const control = <FormArray>this.form.controls['memes']; 

for(let i = control.length-1; i >= 0; i--) { 
    control.removeAt(i) 
} 

Nếu có một cách tốt hơn, tôi mở cho đề xuất! :)

+0

tôi nghĩ rằng nó phải được control.controls.removeAt (i). Vì console.log (control) có một mảng với các điều khiển tên, nếu không bạn sẽ gặp lỗi "Không thể đọc thuộc tính 'được bật" của null ". – Jassi

3

Hãy thử this.myForm.controls['myFormArray'] = this.formBuilder.array([]); với dịch vụ formBuilder được khởi tạo trong trình tạo của bạn.

+0

điều này làm việc cho tôi trong Angular 4 – FireDragon

1

Tôi đã gặp sự cố tương tự, nơi tôi sẽ gặp lỗi sau khi cập nhật biểu mẫu của mình và sau một loạt điều tra và thử nghiệm không thành công, tôi nhận thấy rằng this.myForm.updateValueAndValidity cuối cùng đã thực hiện thủ thuật.

1

MẪU

this.form = this._formB.group({ 
    blocks: this._formB.array([]) 
}); 

phương pháp 1st

let fArray = <FormArray>this.form.controls['blocks']; 
while (fArray.length !== 0) { 
    fArray.removeAt(0) 
} 

2 phương pháp

this.form.setControl('blocks', this._formB.array([])); 
+0

Vui lòng thêm một số giải thích cho câu trả lời của bạn, điều này giúp OP cũng như với những người khác có thể kết thúc ở đây trong khi tìm kiếm vấn đề tương tự. – FilipRistic