- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个由两个 FormArray
、items
和 savedItems
组成的表单。在表单数组中的每个元素上都有一个按钮,可以从数组中删除该元素。
顶部/第一个 FormArray
从对象列表中填充。而第二个 FormArray
是供用户填写的。
问题是,在第一个 FormArray
上,每当我单击“删除条目”按钮时,FormArray
中的所有元素都会被删除,而不是属于(在相同位置)“删除条目”按钮。
这是我的表单定义:
<form [formGroup]="boxForm" (ngSubmit)="onSubmit(boxForm)">
<div class="row" formArrayName="savedItems" *ngFor="let item of getSavedItems.controls; let i = index;" >
<div *ngFor="let trailer of trailerModelList; let x = index;" >
<div class="form-group" [formGroupName]="i" style="margin-bottom: 10px">
<div>
<div class="col-sm-5 form-group">
<label for="name">Origin</label>
<input class="form-control" type="text" placeholder="From" value="{{trailer.fromLocation}}"/>
</div>
<div class="col-sm-5 form-group">
<label for="name">Destination</label>
<input class="form-control" type="text" placeholder="To" value="{{trailer.toLocation}}" />
</div>
<div class="col-sm-3 form-group">
<label for="name">Name</label>
<input class="form-control" type="text" placeholder="Name" value="{{trailer.name}}"/>
</div>
<div class="col-xs-2">
<button class="btn btn-danger" type="button" (click)="removeSavedItem(i)">Remove Entry</button>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="row" formArrayName="items" *ngFor="let item of getItems.controls; let i = index;" >
<div class="form-group" [formGroupName]="i">
<div class="col-md-5 form-group" >
<label for="name">Origin</label>
<input class="form-control" type="text" formControlName="origin" >
</div>
<div class="col-md-5 form-group">
<label for="name">Destination</label>
<input class="form-control" type="text" formControlName="to">
</div>
<div class="col-sm-3 form-group">
<label for="name">Name</label>
<input class="form-control" type="text" formControlName="name" placeholder="Name"/>
</div>
<div class="col-xs-2">
<button class="btn btn-danger" type="button" (click)="removeItem(i)">Remove Entry</button>
</div>
</div>
</div>
<button class="btn btn-success" type="submit" style="margin-right: 10px">Go</button>
<button class="btn btn-primary" type="button" (click)="addItem()" style="margin-right: 10px">New Box</button>
下面是我如何为 FormArray
创建、添加和删除项目:
get getItems(): FormArray {
return this.boxForm.get('items') as FormArray;
}
get getSavedItems(): FormArray {
return this.boxForm.get('savedItems') as FormArray;
}
createBox(): FormGroup {
return this.formBuilder.group({
name: ['', [Validators.required, Validators.minLength(3)]],
origin: ['', [Validators.required, Validators.minLength(1)]],
to: ['', [Validators.required, Validators.minLength(1)]]
});
}
addItem(): void {
this.getItems.push(this.createBox());
}
removeItem(index) {
this.getItems.removeAt(index);
}
removeSavedItem(index) {
this.getSavedItems.removeAt(index);
}
这是一个stackblitz带有我的问题的可重现代码。如果您单击水平栏上方的任何“删除条目”,则两个条目都将从 FormArray
中的该元素中删除,而不是仅从所选元素中删除。
为什么会这样?我很确定这与有两个 for 循环有关。一个用于 savedItem 控件和一个内部循环,用于遍历列表中的元素以填充 FormArray
但我无法查明问题所在,我仍在学习 Angular
最佳答案
问题在于创建您的 FormArray
-property savedItems
,也是这一行:
...
savedItems: this.formBuilder.array([this.createBox()])
...
这一行意味着,您在 FormArray
中只定义了一个 FormGroup
,因此您有一个 index = 0
的元素。
在您的模板文件中,您在 savedItems
block 中有两个循环:
1.) *ngFor="let item of getSavedItems.controls; let i = index;"
这是正确的循环,将为 removeAt
提供正确的功能。
2.) *ngFor="let trailer of trailerModelList; let x = index;"
这是错误的循环,因为您不能像现在这样从模板创建 FromArray
-items。
问题简而言之:通过点击Remove entry
按钮,所有的savedItems
将从数组中移除,因为你只有FormArray
中索引为 0 的一个元素。
解决方案:
第 1 步:使用 createBox()
方法为每个 trailerModelList
项创建一个 FormArray
。
ngOnInit() {
this.boxForm = this.formBuilder.group({
items: this.formBuilder.array([this.createBox()]),
savedItems: this.formBuilder.array([])
});
this.trailerModelList = new Array();
this.trailerModelList.push(new TrailerModel(1, 'test', 'London', 'Paris'));
this.trailerModelList.push(new TrailerModel(2, 'test2', 'Amsterdam', 'Berlin'));
this.trailerModelList.forEach(item => {
(this.boxForm.get('savedItems') as FormArray).controls.push(this.createBox(item.name, item.fromLocation, item.toLocation));
});
}
....
createBox(name: string = null, origin: string = null, to: string = null): FormGroup {
return this.formBuilder.group({
name: [name, [Validators.required, Validators.minLength(3)]],
origin: [origin, [Validators.required, Validators.minLength(1)]],
to: [to, [Validators.required, Validators.minLength(1)]]
});
}
第 2 步: 从模板中删除以下循环:*ngFor="let trailer of trailerModelList; let x = index;"
第 3 步: 将 formControlName
-property 添加到此循环内的表单项:*ngFor="let item of getSavedItems.controls; let i = index ;"
<div class="row" formArrayName="savedItems" *ngFor="let item of getSavedItems.controls; let i = index;" >
<div>
<div class="form-group" [formGroupName]="i" style="margin-bottom: 10px">
<div>
<div class="col-sm-5 form-group">
<label for="name">Origin</label>
<input class="form-control" type="text" placeholder="From" formControlName="origin"/>
</div>
<div class="col-sm-5 form-group">
<label for="name">Destination</label>
<input class="form-control" type="text" placeholder="To" formControlName="to" />
</div>
<div class="col-sm-3 form-group">
<label for="name">Name</label>
<input class="form-control" type="text" placeholder="Name" formControlName="name"/>
</div>
<div class="col-xs-2">
<button class="btn btn-danger" type="button" (click)="removeSavedItem(i)">Remove Entry</button>
</div>
</div>
</div>
</div>
</div>
这里是 stackblitz与工作解决方案。
关于javascript - Angular ReactiveForms FormArray removeAt 移除FormArray中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56031269/
我已经开发了一个应用程序一个月了。我遇到了很多问题,几乎所有问题我都找到了解决方案,而不是打开线程,但有一个设计问题我还没有弄清楚。 假设我有一个名为 MonkeyComponent 的小组件,它只有
我正在尝试禁用reactive_forms中的提交按钮 当我执行此代码时: import 'package:reactive_forms/reactive_forms.dart'; final for
我在我的第一个 Angular 项目中实现 react 形式,我无法弄清楚为什么选择的值没有被改变。对于普通文本的输入字段,它安静地工作,对于选择字段,什么也没有发生。我跟着几个教程,无法解决。表单加
我有一个响应式(Reactive)表单,我想直接填充我的模型。 form.component.html ... many more fields
这个问题在这里已经有了答案: Angular - controlValueAccessor method writeValue() not being called (2 个回答) 2年前关闭。 我创
我正在创建一个由两个 FormArray、items 和 savedItems 组成的表单。在表单数组中的每个元素上都有一个按钮,可以从数组中删除该元素。 顶部/第一个 FormArray 从对象列表
我试图在表单上显示一个 FormControl 以保存电话国家/地区代码前缀,并且我希望它始终在左侧填充区域显示一个加号。我的赌注是在输入中使用 :before 元素,但令人惊讶的是我无法让它出现在
在构建更复杂的响应式表单时,我在多次嵌套 reactiveFormGroups 时偶然发现了一个问题。 所以我有两种情况: 表单组件 -> 表单局部组件 -> 自定义输入组件 表单组件 -> 自定义输
我有一个响应式(Reactive)表单,当用户在输入中按下 ESC 键时,我想在表单隐藏之前显示“你确定吗”模式。 一旦显示模态,我就会在控制台中收到以下异常: ERROR Error: Expres
我正在使用 angular5 reactivemodule 在我的应用程序中显示一个表单。我还使用了必需的验证器,它随后会将字段设置为红色并向用户显示错误消息。 它按预期工作,但是当我使用 重置表单时
我正在使用 Material Design 和 ReactiveForms 来处理级联下拉菜单。该代码有一个州的下拉列表,一旦选择,将过滤城市的下拉列表。 我找到了这个例子http://www.tal
我正在使用 Material Design 和 ReactiveForms 来处理级联下拉菜单。该代码有一个州的下拉列表,一旦选择,将过滤城市的下拉列表。 我找到了这个例子http://www.tal
我尝试使用 来自 Angular Material(不是 AngularJS)而不使用 react 形式。但是他们所有的例子都使用 react 形式...... 我尝试做的事情: 1. 当在 mat-
我在 ReactiveForm FormControl 上放置了一个货币属性指令,它在输入事件 (onKeyDown) 上使用 @HostListener 来移除输入时输入的所有无效字符(字母和符号)
给定一个组件,带有一个表单声明 ngOnInit() { this.form = this.fb.group({ address: [""], }); } 表单上的两个输入控件,都引用
大家好,我有一个 Formarray,其中有一组角色。在编辑期间,它会动态删除并添加该表单数组中的角色,直到这里一切正常,但是当我提交表单时,它会出现错误并且页面会刷新。 错误:类型错误:无法读取 n
我是一名优秀的程序员,十分优秀!