javascript - FormArray - 如何将字符串数组传递给它?

标签 javascript arrays angular typescript angular-material

这是我的表单组:

this.productGroup = this.fb.group({
  name: ['', Validators.compose([Validators.required, Validators.maxLength(80)])],
  variants: this.fb.array([
    this.fb.group({
      type: '',
      options: this.fb.array([])
    })
  ])
});

如何将字符串数组传递给选项?就像这样的['string1','string2']。我在这里动态地获取这些值:stackblitz ,但是我不确定如何填充数组。我想将通用字符串数组直接传递给 options

variants 数组示例:

variants: [ 
   { type: 'Color', options: ['Red', 'Blue'] },
   { type: 'Size', options: ['Small', 'Medium', 'Big'] }
]

HTML:

<form [formGroup]="productGroup">
  <input formControlName="name">
  <div formArrayName="variants" *ngFor="let item of productGroup.controls['variants'].controls; let i = index;">
    <div [formGroupName]="i">
      <mat-form-field>
        <input type="text" placeholder="Variable Type" aria-label="Number" matInput formControlName="type" [matAutocomplete]="auto">
        <mat-autocomplete #auto="matAutocomplete">
          <mat-option *ngFor="let type of types" [value]="type">
            {{type}}
          </mat-option>
        </mat-autocomplete>
      </mat-form-field>
      <mat-form-field>
        <mat-chip-list #chipList>
          <mat-chip *ngFor="let opt of typesOptionsArray[i]" [selectable]="true"
                    [removable]="true" (removed)="removeOpt(opt, i)">
            {{opt}}
            <mat-icon matChipRemove>cancel</mat-icon>
          </mat-chip>
          <input placeholder="Type Options"
                  [matChipInputFor]="chipList"
                  [matChipInputSeparatorKeyCodes]="separatorKeysCodes"
                  [matChipInputAddOnBlur]="true"
                  (matChipInputTokenEnd)="addOpt($event, i)">
        </mat-chip-list>
      </mat-form-field>
    </div>
    <div class="row">
      <a href="javascript:" (click)="addItem()"> Add Variant </a>
      <a href="javascript:" (click)="removeItem(i)" *ngIf="i > 0"> Remove Variant </a>
    </div>
  </div>
</form>

最佳答案

我在stackblitz for adding array value in the options array上创建了一个示例应用程序.

我建议不要创建选项字段的 FormArray,而是尝试创建 FormControl。我更改了创建 FormGroup 的代码。

这是formgroup的代码。

 this.productGroup = this.fb.group({
  name: ['', Validators.compose([Validators.required, Validators.maxLength(80)])],
  variants: this.fb.array([
    this.fb.group({
      type: '',
      options: ''
    })
  ])
});

我在组件'addOption'和'removeOption'中添加了两个方法,当添加选项时,你需要将一个字符串插入选项数组中。

这是代码:

let variants = <FormArray>this.productGroup.controls.variants;
let variantFormGroup = <FormGroup>variants.controls[0];
let optionValue = variantFormGroup.controls.options.value;
if(!optionValue)
    optionValue = [];
optionValue.push(`chip${this.currentIndex}`); // push your actutal string value
variantFormGroup.controls.options.setValue(optionValue);

this.currentIndex++; //don't consider this, this is just for adding new name

这是从选项数组中删除字符串值的代码

 let optionValue = this.productGroup.value.variants[0].options;
    if(optionValue.length > 0){
      //let indexOf = optionValue.indexOf(removeValue); find the index number with your value.
      optionValue.splice(0,1);
      let variants = <FormArray>this.productGroup.controls.variants;
      let variantFormGroup = <FormGroup>variants.controls[0];
      variantFormGroup.controls.options.setValue(optionValue);

    }    

这是在选项数组中添加几个值后的 json 结果:

{ "name": "", "variants": [ { "type": "", "options": [ "chip4", "chip5", "chip6", "chip7", "chip8" ] } ] }

如果您有任何疑问,请告诉我。

关于javascript - FormArray - 如何将字符串数组传递给它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127171/

相关文章:

javascript - 无法从 jquery 函数中访问 javascript 类

javascript - Express res.sendFile 强制下载而不是提供 HTML

javascript - 复制/覆盖 javascript 的 console.log 函数

arrays - 如何将非原始对象数组写入 Arduino EEPROM,然后在每次程序启动时将该数组读入内存

通过取消引用其指针来计算数组的大小

javascript - 使用 for 循环从数组中获取数据来填充表

Angular2-下拉列表不更新

angular - 从 void 函数返回

angular - 修改 TestBed.overrideComponent 中定义的组件

javascript - 如何将占位符属性添加到 CKEditor 的实例?