标签: formarray

打字稿.FormGroup FormArray - 按值删除一个元素对象.Angular 2 4

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, …

typescript angular angular-reactive-forms formarray

47
推荐指数
2
解决办法
3万
查看次数

具有嵌套表单数组的角度反应表单

我是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 formarray

30
推荐指数
1
解决办法
5万
查看次数

如何获取角形数组中已更改项的索引

我正在使用带反应形式的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)

angular angular-reactive-forms formarray

16
推荐指数
2
解决办法
2万
查看次数

无法将数据修补到FormArray

无法将值修补为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)

html javascript typescript angular formarray

14
推荐指数
2
解决办法
5322
查看次数

Angular的FormArray什么时候是传统数组,什么时候是FormArray对象?

我已经使用ControlValueAccessor构建了一个自定义输入组件,并且可以很好地将标签添加为选择。(Stackblitz

我的问题是:

  1. 当我在表单(城市和州控制)中实现组件时
  2. 通过选择一些选项将值添加到两个控件
  3. 提交表格
  4. 有时控制值是选定标签的数组(如预期)
  5. 其他时候它是一个实际的FormArray对象

这是提交角度形式后的两个相同组件值的屏幕截图。一个是对象数组(预期),另一个是实际的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?

javascript forms angular formarray

12
推荐指数
1
解决办法
246
查看次数

Kendo:在顶部将FormGroup插入FormArray

问题陈述 :

在下面的stackblitz演示中,我能够FormGroup通过单击Add按钮并(blur)从一个控件触发事件以更新共享该控件的另一个控件的值,在网格的开头动态插入动态对象rowIndex。现在的问题是,如果我在多个新添加的对象上插入多个formGroups并触发(blur)事件,FormGroups它将更新其他控件的值以及具有不同的值rowIndex

重现此问题的步骤:

  • 打开下面的演示链接。
  • 通过单击添加按钮添加多行(2行)。
  • 在第二个新添加的行的名称字段中输入值,然后将焦点对准。
  • 它会在两个新添加的行中更新年龄字段,而不是仅在第二行中更新。

Stackblitz演示: https ://stackblitz.com/edit/angular-oitz5j-4uezqr

要求:

跳出特定行的任何名称字段,同一行的“年龄”字段应显示一个随机数,而不会影响其他行。

到目前为止我尝试了什么?

  • 试图使用Array unshift()方法但出现错误

    类型“ FormArray”上不存在属性“ unshift”

  • 尝试使用FormArray.insert()方法。如果我们要FormGroup在特定索引处添加一个,它将可以工作。但是它无法FormGroupsFormArray动态顶部插入多个。

更新:如果没有Kendo Grid,上述问题可以正常工作。请检查以下演示。

演示: https : //stackblitz.com/edit/angular-oitz5j-2a31gs

github / stackoverflow中的相关问题:

https://github.com/angular/angular/issues/16322

Angular-表单数组推送特定索引

注意:如果我们要将控件添加到Grid的末尾,则它的工作原理很简单。请检查下面的演示,该演示在最后添加控件时效果很好。

演示: https : //stackblitz.com/edit/angular-oitz5j-aszrjq

kendo-grid angular angular-reactive-forms formarray formgroups

11
推荐指数
2
解决办法
338
查看次数

Angular材料表中的FormArray

注意:我在经典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

10
推荐指数
2
解决办法
6015
查看次数

如何在Angular Reactive 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

8
推荐指数
1
解决办法
2863
查看次数

角度(表单数组)值更改不起作用

表单数组值更改不起作用。我无法控制订阅者方法内的值。下面是我的基本表单数组代码。

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)

该控制台无法正常工作..带我了解处理表单数组的正确方法

javascript angular-forms formarray angular-formbuilder

8
推荐指数
1
解决办法
6212
查看次数

Angular2 patchValue JSON 数据到formArray

我有这样的 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)

angular formarray

7
推荐指数
2
解决办法
7120
查看次数