2017-05-12 1 views
3

사용자가 빈 생성 된 컨트롤에 값을 추가 한 후 formArray을 업데이트하려고합니다.각도 4 FormValue의 인덱스를 기반으로 patchValue

현재 사용자가 새 항목을 추가하기로 선택하면 formArray에 값이 비어 있습니다.

buildItem(item?: any, key?: any): FormGroup { 
    // Item will pass undefined for initial buildItem in onLoad and new items 
    let itemName: string; 
    let keyValue: string; 
    if (item === undefined) { 
    itemName = ''; key = '' } 
    else { 
    itemName = item.name; keyValue = key 
    }; 

    /** 
    * Builds a single item for form group array in the collectionForm. 
    */ 
    return this.formBuilder.group({ 
       item: [itemName || '', Validators.required], 
       properties: { item, key: key } || {} }); 
} 

이 기능은 이미 추가 된 항목의 초기 생성 및 업데이트에 적합합니다. 문제는 빈 값으로 추가 된 새 항목입니다. 나는 새로운 항목을 추가 할 때 나는 그러나 patchValue가에서 작동하지 않는 나는 patchValue

this.items.patchValue([{ 
     // item being returned from firebase promise 
     item: item.name, 
     properties: { item: item.name, key: item.$key' } 
}]); 

을 추가 한 새 항목의 퇴피하기위한 방법에서 properties.key

에서 중포 기지에서 리턴 키를 추가해야 모든. 내가 새 값을 업데이트하려고해도 값이 firebase에 저장되었지만 값이 비어 있거나 값이 초기 값인 BuildItem()이 아닌 값으로 반환됩니다. patchValue

그것은 컨트롤의 구조와 일치하고, 그룹에 정확한 컨트롤 값과 일치하도록 최선을 다할 것입니다 배열을 받아

각도 FormArray 문서에. REF

해당 값을 업데이트 할 수도 있고 업데이트하지 않을 수도 있습니다. 시도하는 것이 최선의 방법일까요? 나는 내가 원하는 값에 대한 인덱스를 추가 할 수 있다면 그것이 문제가되어서는 안된다. 그래서 removeAt(idx)

와 마찬가지로 나는

this.form.patchValue.atIndex(this.idx,[{ 
     item: item.name, 
     properties: { item: item.name, key: item.$key' } 
}]; 

하지만 난 그렇게 할 수 확실하지 뭔가를 쓸 수 있다면 .. 잘 확신 그것이 불가능을하는 형태. formArray에 패치를 적용하거나 정확하게이 항목을 이해하지 못하는 항목을 구체적으로 타겟팅 할 수있는 방법이 있습니까?

나는 종류의 난이 빈에 초기 컨트롤을 제거하기 위해

this.items.removeAt(this.idx); 

을 추가 한 후 그러나 formArray

this.items.push(this.buildItem(...)); 

에 새 값을 눌러이 멀리 얻을 수 있습니다 빌드, 어떤 종류의 좋은 코드처럼 보이지 않습니다.+ AbstractControl#patchValue

+1

'this.items.at (index) .patchValue (...)'는 작동하지 않습니다. ? – developer033

+0

@ developer033 그래, 고마워, 그걸 답으로 추가 할 수있어. –

+0

오해가있을 수 있지만 값을 설정하려면 왜 비어있는 컨트롤을 먼저 만드나요? :) – Alex

답변

0

당신은 당신이 구멍의 배열 구조를 업데이트하려면 단순히 새로운 FormControl를 작성하여이 작업을 수행 할 수 있습니다

this.form.setControl('items', new FormControl(arrayItemsValue)); 

를 또는 업데이트하기 전에 모든 항목을 제거하여 그들 :

const items = (<FormArray>this.form.get('items')); 
for (let i = 0; i < items.length; i++) { 
    items.removeAt(i); 
} 
this.form.get('items').setValue(arrayItemsValue);