this.formGroup = this.formBuilder.group({
images: this.fb.array([])
});
Run Code Online (Sandbox Code Playgroud)
我以这种方式添加新元素:
this.images.push(new FormControl(new ImageCreateForm(this.imageResponse.id)));
get images(): FormArray {
return <FormArray>this.formGroup.controls.images;
}
Run Code Online (Sandbox Code Playgroud)
我的课程:
export class ImageCreateForm {
id: number;
constructor(id: number) {
this.id = id;
}
}
export class ImageResponse {
id: number;
url: string;
}
Run Code Online (Sandbox Code Playgroud)
当我添加图像时,我的{{ formGroup.value | json }}是:
"images": [
{
"id": 501
},
{
"id": 502
},
{
"id": 503
}
]
Run Code Online (Sandbox Code Playgroud)
我想在发送表单POST请求之前删除之前的图像(例如只有图像id=502)formGroup.可能吗?我试过使用reset方法,但这删除所有元素:
this.images.reset({"id":image.id});.image它在哪里是一个ImageResponse对象.
结果:{"images": [ null, …
我是Angular 2的新手,并决定学习最好的方法是通过Angular官方指南.
我浏览了反应表单指南 https://angular.io/guide/reactive-forms
演示链接:https://stackblitz.com/angular/jammvmbrpxle
虽然内容总体来说非常好,但我仍然坚持如何实现更复杂的表单.在给定的示例中,每个Hero都有可能存在许多地址.地址本身就是一个扁平的对象.
如果地址有其他信息,例如位于地址的房间的颜色和类型,该怎么办?
export class Address {
street = '';
city = '';
state = '';
zip = '';
rooms = Room[];
}
export class Room {
type = '';
}
Run Code Online (Sandbox Code Playgroud)
这样表单模型看起来像这样......
createForm() {
this.heroForm = this.fb.group({
name: '',
secretLairs: this.fb.array([
this.fb.group({
street: '',
city: '',
state: '',
zip: '',
rooms: this.fb.array([
this.fb.group({
type: ''
})]),
})]),
power: '',
sidekick: ''
});
Run Code Online (Sandbox Code Playgroud)
}
编辑 - 与ngOnChanges一起使用的最终代码
英雄detail.component.ts
createForm() {
this.heroForm = this.fb.group({
name: …Run Code Online (Sandbox Code Playgroud) 我正在使用带反应形式的Angular 4.我有一个表单数组,我试图绑定到我在组件中跟踪的数组.我正在使用反应式表单,所以我可以进行验证,所以我不想使用模板表单方法.
我将项添加到表单数组中,如下所示:
createFormWithModel() {
this.orderForm = this.fb.group({
orderNumber: [this.order.ProductBookingOrder],
orderDate: [this.order.PurchaseOrderIssuedDate],
lineDetailsArray: this.fb.array([])
})
const arrayControl = <FormArray>this.orderForm.controls['lineDetailsArray'];
this.order.ProductBookingDetails.forEach(item => {
let newGroup = this.fb.group({
ProductName: [item.ProductName],
Quantity: [item.ProductQuantity.Quantity],
UOM: [item.ProductQuantity.UOM],
RequestedShipDate: [item.RequestedShipDate]
})
})
}
Run Code Online (Sandbox Code Playgroud)
orderForm显然是我的反应形式FormGroup.订单是我从API获取的对象,我想更新其值,包括行详细信息.我想我应该在每个newGroup上使用'valueChanges.subscribe',但我不知道如何获得已更改的项的索引.有什么想法吗?
newGroup.valueChanges.subscribe('i want value and index some how' => {
this.order.ProductbookingDetails[index].ProductName = value.ProductName;
});
Run Code Online (Sandbox Code Playgroud)
这是此部分的HTML:
<tbody formArrayName="lineDetailsArray">
<tr [formGroupName]="i" *ngFor="let line of orderForm.controls['lineDetailsArray'].controls; index as i">
<td><input class="form-control" type="text" placeholder="Product Name" formControlName="ProductName" required/></td>
<td><input class="form-control" type="number" step=".01" (focus)="$event.target.select()" placeholder="Quantity" formControlName="Quantity"/></td>
<td><input class="form-control" readonly …Run Code Online (Sandbox Code Playgroud) 无法将值修补为FormArray resultList.
有人可以解释我,我错过了什么?
TS档案:
import { Component, OnInit } from '@angular/core';
import { Student } from '../student';
import { FormGroup, FormControl, Validators, FormArray } from '@angular/forms';
@Component({
selector: 'app-container',
templateUrl: './container.component.html',
styleUrls: ['./container.component.css']
})
export class ContainerComponent implements OnInit {
studList: Student[] = [];
myform: FormGroup = new FormGroup({
firstName: new FormControl('', [Validators.required, Validators.minLength(4)]),
lastName: new FormControl(),
gender: new FormControl('male'),
dob: new FormControl(),
qualification: new FormControl(),
resultList: new FormArray([])
});
onSave() {
let stud: Student = new Student();
stud.firstName …Run Code Online (Sandbox Code Playgroud) 我已经使用ControlValueAccessor构建了一个自定义输入组件,并且可以很好地将标签添加为选择。(Stackblitz)
我的问题是:
这是提交角度形式后的两个相同组件值的屏幕截图。一个是对象数组(预期),另一个是实际的FormArray对象,其中.value属性包含对象数组!
如果您不想访问StackBlitz,这是一些工作原理代码。
自定义控件是这样实现的。
this.form = this.fb.group({
tags: this.fb.array([])
});
Run Code Online (Sandbox Code Playgroud)
当用户选择一个下拉项目或点击时,将按以下方式保存对象:
get tagsArray(): FormArray { return this.form.get('tags') as FormArray; }
...
this.tagsArray.push(new FormControl(value));
this.onChange(this.tagsArray); // update controller value
Run Code Online (Sandbox Code Playgroud)
您可以像这样在我的StackBlitz中的formGroup中实现该组件(也在我的StackBlitz中):
表格初始化
public form: FormGroup = this.fb.group({
states: [],
cities: []
});
Run Code Online (Sandbox Code Playgroud)
模板
<input-tags formControlName="cities" label="Cities" [typeAhead]="cities" [displayKeys]="['name']" filterKeys="['name']"></input-tags>
<input-tags formControlName="states" label="States" [typeAhead]="states" [displayKeys]="['name']" filterKeys="['name']"></input-tags>
Run Code Online (Sandbox Code Playgroud)
但问题是:
Angular的FormArray什么时候是传统数组,什么时候像Object一样的FormArray Array?
问题陈述 :
在下面的stackblitz演示中,我能够FormGroup通过单击Add按钮并(blur)从一个控件触发事件以更新共享该控件的另一个控件的值,在网格的开头动态插入动态对象rowIndex。现在的问题是,如果我在多个新添加的对象上插入多个formGroups并触发(blur)事件,FormGroups它将更新其他控件的值以及具有不同的值rowIndex。
重现此问题的步骤:
Stackblitz演示: https ://stackblitz.com/edit/angular-oitz5j-4uezqr
要求:
跳出特定行的任何名称字段,同一行的“年龄”字段应显示一个随机数,而不会影响其他行。
到目前为止我尝试了什么?
试图使用Array unshift()方法但出现错误
类型“ FormArray”上不存在属性“ unshift”
尝试使用FormArray.insert()方法。如果我们要FormGroup在特定索引处添加一个,它将可以工作。但是它无法FormGroups在FormArray动态顶部插入多个。
更新:如果没有Kendo Grid,上述问题可以正常工作。请检查以下演示。
演示: https : //stackblitz.com/edit/angular-oitz5j-2a31gs
github / stackoverflow中的相关问题:
https://github.com/angular/angular/issues/16322
注意:如果我们要将控件添加到Grid的末尾,则它的工作原理很简单。请检查下面的演示,该演示在最后添加控件时效果很好。
kendo-grid angular angular-reactive-forms formarray formgroups
注意:我在经典HTML表中成功完成了FormArray,如下所示.我希望在Angular Material表中有一个FormArray并用数据填充它.我尝试了与经典HTML表格相同的方法,但我无法编译它,因为错误"无法找到带有'name'的列'''"
<div class="form-group">
<form [formGroup]="myForm" role="form">
<div formArrayName="formArrList">
<table>
<tr>
<th>Name</th>
<th>School</th>
</tr>
<tr *ngFor="let list of myForm.get('formArrList').controls;let i = index" [formGroupName]="i">
<td>
<div class="col-sm-6">
<input class="form-control" type="text" formControlName="name"/>
</div>
</td>
<td>
<div class="col-sm-6">
<input class="form-control" type="text" formControlName="school"/>
</div>
</td>
</tr>
</table>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
我尝试在Angular Material Table中有一个FormArray这是我的HTML文件
<div>
<form [formGroup]="myForm" role="form">
<ng-container formArrayName="formArrList">
<mat-table #table [dataSource]="myDataSource">
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
<ng-container *ngFor="let detailsItems of myForm.get('formArrList').controls;let i = index" [formGroupName]="i">
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef>Name</mat-header-cell>
<mat-cell *matCellDef="let …Run Code Online (Sandbox Code Playgroud) angular-material angular-material2 angular angular4-forms formarray
我有一个角度4的表单,包含名字+姓氏和包含2个下拉列表(选择)的formarray作为级联下拉列表和删除按钮.表单的其余部分还包含一个发送按钮和一个添加选项按钮.我在这里添加了截图,让您更好地理解.表单添加,删除按钮和发送按钮工作有1个问题级联下拉列表只有当有1个级联下拉列表时,当我添加一个额外的级联时,选择前一组级联的值选择第二个选择搞砸了.我在这里添加了图片以获得更好的解释
正如你可以在第2和第3个画面cascadingdropdown工作当我改变标准选择看我FET正确选项在第二下拉菜单选择

在第4张图片第5张图片和第6张图片上,您可以看到添加选项按钮有效,但是当我在选项2第一个下拉列表中选择一个条件时,它与选项1第二次掉落混乱,现在它还包含第二个选项中的下拉选项
这是我的HTML代码
<form [formGroup] = "profileForm">
<h1>Profile Form</h1>
<div>
<label for = "first-name-input">First Name</label>
<input type="text" id="first-name-input" formControlName ="firstNameInput">
</div>
<div>
<label for = "last-name-input">Last Name</label>
<input type="text" id="last-name-input" formControlName ="lastNameInput">
</div>
<div formArrayName="optionGroups">
<div *ngFor="let optionGroup of profileForm.controls['optionGroups'].controls; let i=index "[formGroup]="optionGroup">
<h4>Option {{ i + 1 }} </h4>
<div>
<label for = "select-input">Criteria</label>
<select id="select-input" (change)="onSelectSelect($event.target.value, i)" formControlName ="selectInput">
<option value="0" disabled selected>Select a Criteria</option>
<option *ngFor="let select of selects" [value]= "select.name">{{select.id}}</option>
</select>
<label for = "where-input">Option</label> …Run Code Online (Sandbox Code Playgroud)cascadingdropdown typescript angular angular-reactive-forms formarray
表单数组值更改不起作用。我无法控制订阅者方法内的值。下面是我的基本表单数组代码。
ordersData = [
{ id: 100, name: 'order 1' },
{ id: 200, name: 'order 2' },
{ id: 300, name: 'order 3' },
];
this.formGroup = this.formBuilder.group({
testControl: this.formBuilder.array([])
});
get formGroupControl() {
return (this.formGroup.get('testControl') as FormArray);
}
private addFormControl() {
this.ordersData.forEach((o, i) => {
(this.formGroup.get('testControl') as FormArray).controls.push(this.formBuilder.control(''));
});
}
Run Code Online (Sandbox Code Playgroud)
我在 ngOnInit() 中调用了这个 addFormControl() 函数,如果我尝试使用以下方式查看值更改
this.formGroup.get('testControl').valueChanges.subscribe(value => {
console.log('log', {value});
});
Run Code Online (Sandbox Code Playgroud)
该控制台无法正常工作..带我了解处理表单数组的正确方法
我有这样的 Json 数据:
assets/details.json
{
"name" : "john",
"age" : 20,
"address" : [{
"main": "address1",
"sub": "address2"
},
{
"main": "add1",
"sub": "add2"
}]
}
Run Code Online (Sandbox Code Playgroud)
我想用patchValue.
我试过这个。
app.component.ts
{
"name" : "john",
"age" : 20,
"address" : [{
"main": "address1",
"sub": "address2"
},
{
"main": "add1",
"sub": "add2"
}]
}
Run Code Online (Sandbox Code Playgroud)
我的 HTML 页面是这样设计的:
app.component.html
export class AppComponent {
data: FormGroup
constructor(private FB: FormBuilder, private service: DataService) { }
ngOnInit() {
this.data = this.FB.group({
name: [''],
age: [''], …Run Code Online (Sandbox Code Playgroud) formarray ×10
angular ×9
javascript ×3
typescript ×3
formgroups ×1
forms ×1
html ×1
kendo-grid ×1