2016-04-14 49 views
5

如何使用Angular2管理持有未定義數量字段的表單?Angular2表格控件組持有未定義數量的控件

在我的情況下,我需要創建一個從哪裏用戶可以添加和刪除一些文件塊。這就像一個地址簿,用戶可以添加一個或十個地址。每個地址都有一些像街道,街道號碼等字段。

我這個樣子的:

let address = fb.group({ 
     street: fb.control(null, Validators.required), 
     streetNumber fb.control(null, Validators.required) 
    }); 

this.userForm = fb.group({ 
     name: fb.control(null, Validators.required), 
     firstName: fb.control(null, Validators.required), 
     address: fb.group({ 
      1: address 
      }) 
     }); 

我真的不知道如何在模板管理這個。

我嘗試寫這樣的東西有些模板中,但很明顯,它不工作...

<form [ngFormModel]="userForm"> 
<input type="text" ngControl="name" #name="ngForm"/> 
<input type="text" ngControl="firstName" #firstName="ngForm"/> 

<div *ngFor="#address of userForm.controls['address'].controls"> 
    <input type="text" ngControl="street" #street="ngForm"/> 
    <input type="text" ngControl="streetNumber" #streetNumber="ngForm"/> 
</div> 

編輯

我已經做了一個更好的解釋的Plunker http://plnkr.co/edit/ffYe1479WnxYOQrbxwLF?p=preview

+0

「顯然不工作的意思」是什麼? –

+0

我寫的模板不能完成這項工作,因爲它不是正確的寫法。角度引發錯誤,因爲他沒有在控件組「userForm」中找到控件「街道」。 – Waldo

+0

看起來你不需要'#street =「ngForm」'。如果你刪除它會怎麼樣? –

回答

6

我爲你實現它,見Plunker或更好,Plunker [email protected]

import {Component} from 'angular2/core'; 
import { 
    FORM_DIRECTIVES, FormBuilder, ControlGroup, ControlArray, Validators, NgForm, Control, 
    AbstractControl 
} from 'angular2/common'; 

@Component({ 
    selector: 'my-app', 
    template: ` 
    <form [ngFormModel]="userForm" *ngIf="userForm"> 
     <p><label><input id="date" type="text" ngControl="name" #name="ngForm"/> Name</label></p> 

     <p><label><input id="date" type="text" ngControl="firstName" #firstName="ngForm"/> FirstName</label></p> 

     <h3>Add address</h3> 
     <ul ngControlGroup="addresses"> 

     <li *ngFor="#ctrl of objToArray(userForm.find('addresses').controls); #i = index" 
     ngControlGroup="{{ctrl}}"> 
      {{ctrl}}: 
      <input ngControl="street" placeholder="Street"> 
      <input ngControl="streetNumber" placeholder="StreetNumber"> 
     </li> 
     </ul> 

    <div (click)="addAddress()" style="cursor: pointer"> Add Another Address</div> 

    </form> 

    `, 
    directives: [FORM_DIRECTIVES] 
}) 
export class AppComponent { 
    userForm: ControlGroup; 

    constructor(private fb: FormBuilder) { 

    this.userForm = fb.group({ 
     name: fb.control(null, Validators.required), 
     firstName: fb.control(null, Validators.required), 
     addresses: fb.group({ 
     address1: fb.group({ 
      street: fb.control(null, Validators.required), 
      streetNumber: fb.control(null, Validators.required) 
     }) 
     }) 
    }); 

    console.log(this.userForm); 

    } 

    objToArray(o){ 
    return Object.keys(o); 
    } 

    addAddress() { 
    let addressField = this.fb.group({ 
     street: this.fb.control(null, Validators.required), 
     streetNumber: this.fb.control(null, Validators.required) 
    }); 

    (<ControlGroup>this.userForm.find('addresses')).addControl(
     'address' + (Object.keys((<ControlGroup>this.userForm.find('addresses')).controls).length + 1), addressField); 
    } 
} 
+1

謝謝! 我已經在我身邊做了一些測試,並最終找到類似您的代碼的東西。 http://plnkr.co/edit/ffYe1479WnxYOQrbxwLF?p=preview – Waldo

+0

嗨,你能幫我解決這個問題嗎?http://stackoverflow.com/questions/38257443/onsubmit-return-all-the-rows - 輸入值的角度2/38259063#38259063 –

+0

嗨沃爾多,當我嘗試你的方法添加另一行,我得到這個錯誤「[ts] 屬性'推'不存在類型'AbstractControl'。」。任何想法我可能會失蹤? –