Angular 角度2-具有可编辑输入的ngFor对象数组的双向绑定

Angular 角度2-具有可编辑输入的ngFor对象数组的双向绑定,angular,angular2-forms,Angular,Angular2 Forms,我是Angular 2的新手,尝试使用可编辑输入实现ngFor对象列表,能够添加新对象并保存数据。 数据如下: business: { email: "email@something.com", locations: [ { country: "US", city: "city 1", address_line_1: "address 1"}, { country: "Australia", city: "city 1", address_line_1: "address 2"} ]} 在组

我是Angular 2的新手,尝试使用可编辑输入实现ngFor对象列表,能够添加新对象并保存数据。 数据如下:

business: { email: "email@something.com", 
locations: [
{ country: "US", city: "city 1", address_line_1: "address 1"},
{ country: "Australia", city: "city 1", address_line_1: "address 2"}
]}
在组件中:

ngOnInit() {
this.businessForm = new FormGroup({
        email: new FormControl(null, [Validators.required]), 
        locationCountry: new FormControl(null)
});
addLocation() {
    this.isFormChanged = true;
    let newLocation = {};
    this.business.locations.push(newLocation);
}

removeLocation(item){
    if (null !== item) {
        this.isFormChanged = true;
        this.business.locations.splice(item, 1);
    }
}
Html:

看起来它将所有输入值更改为最后一个。 我试图通过FormBuilder实现同样的想法,但也没有成功。

我创建了一个。我删除formControlName是因为它不是FormsModule,而是ReactiveFormsModule——这是不同的

有关vs之间的更多信息,请阅读文档。此外,最好删除该值,因为您使用的[ngModel]正在对该值进行双向数据绑定

  <input
                        id="locations-{{index}}"
                        [(ngModel)]="business?.locations[index].country"
                        name="locations-{{index}}"
                        type="text" 
                        class="form-control"
                        placeholder="Country" 
                        aria-label="Country"
                        >
我创造了一个新的世界。我删除formControlName是因为它不是FormsModule,而是ReactiveFormsModule——这是不同的

有关vs之间的更多信息,请阅读文档。此外,最好删除该值,因为您使用的[ngModel]正在对该值进行双向数据绑定

  <input
                        id="locations-{{index}}"
                        [(ngModel)]="business?.locations[index].country"
                        name="locations-{{index}}"
                        type="text" 
                        class="form-control"
                        placeholder="Country" 
                        aria-label="Country"
                        >

回答,因为我还不能发表评论。除了@alexKhymenko的答案外,如果您想坚持使用ReactiveFormsModule,您还必须将您在组件中创建的父formGroup businessForm添加到模板中。虽然不确定这是否能解决您的问题,但请尝试将此属性添加到模板的顶部,如下图所示。如果您对非反应形式感到满意,那么@alexKhymenko的回答可能就足够了。

回答,因为我还不允许发表评论。除了@alexKhymenko的答案外,如果您想坚持使用ReactiveFormsModule,您还必须将您在组件中创建的父formGroup businessForm添加到模板中。虽然不确定这是否能解决您的问题,但请尝试将此属性添加到模板的顶部,如下图所示。如果您对非反应形式感到满意,那么@alexKhymenko的回答可能就足够了。

您可以尝试删除该选项吗?让业务定位后?.location我不认为反应式表单适合双向数据绑定,我想您应该尝试使用模板驱动的表单。我只是尝试删除?-相同的错误,再加上一个错误。您可以尝试删除该错误吗?让业务定位后?.location我不认为反应式表单适合双向数据绑定,我想您应该尝试使用模板驱动的表单。我只是尝试删除?-同样的错误再加上一个。谢谢,@alexKhymenko!我可能会继续使用反应形式。问题是有更多的元素与FormsModule一起工作,我希望以相同的方式解决它。@InnaZis请记住不要同时使用它们。快乐编码:-谢谢,@alexKhymenko!我可能会继续使用反应形式。问题是有更多的元素与FormsModule一起工作,我希望以相同的方式解决它。@InnaZis请记住不要同时使用它们。快乐编码:-谢谢,尝试使用此属性,没有帮助。我可能会根据@alexKhymenko的建议重写。谢谢,尝试使用此属性,没有帮助。我可能会根据@alexKhymenko的建议重写。
  <input
                        id="locations-{{index}}"
                        [(ngModel)]="business?.locations[index].country"
                        name="locations-{{index}}"
                        type="text" 
                        class="form-control"
                        placeholder="Country" 
                        aria-label="Country"
                        >