【问题标题】:How to use [(ngModel)] in ngFor with dynamic Name (Key)如何在具有动态名称(键)的 ngFor 中使用 [(ngModel)]
【发布时间】:2021-09-12 02:28:16
【问题描述】:

我有 NgFor 在两个不同的 div 上生成的角度形式。我想让表单字段独一无二。 both fields are not working individually

<div *ngFor="let configField of configFields; let i = index"><mat-form-field fxFlex fxFlex.lt-md="calc(50% - 16px)" >
    <input matInput placeholder="Url" name="url_{{i}}" [(ngModel)]="headerFields.url" >
  </mat-form-field>
  <mat-form-field fxFlex fxFlex.lt-md="calc(50% - 16px)" >
  <input matInput placeholder="Method" name="type_{{i}}" [(ngModel)]="headerFields.type">
 </mat-form-field></div>

我想在 (headerFields)Array 中唯一标识的字段名称上添加标志.. like name="type_{{i}}" type_1 ,type_2

【问题讨论】:

    标签: javascript angular angular-material angular-reactive-forms angular2-template


    【解决方案1】:

    在初始化或分配 configFields 时,您可以初始化或分配给 headerFields 一个长度等于 configFields 的数组,其中 url 和 type 设置为空。类似于以下内容:

    const configFields = [1,2,3];
    const headerFields = Array.from(configFields, (el) => ({ url: '', type: ''})) // Set to empty string or null as desired]

    【讨论】:

    • 是的,但我正在使用 [(ngModel)] 它在运行时创建字段名称相同.. 请看提到的图片i.stack.imgur.com/EtwfC.png
    • 字段名称和您的表单模型之间没有直接关联。假设您有一个上面建议的 headerFields 数组,您应该能够设置 [(ngModel)]="headerField[i].url" 并同样设置类型。如果这不是您要寻找的答案,您能否详细说明您想要实现的目标?
    • 我有从 configFields 循环生成的手风琴。每个手风琴都有表单和字段。如果我尝试在第一个手风琴中插入数据,这些数据也插入到第二个手风琴中...例如,您可以查看图片 i.stack.imgur.com/EtwfC.png 手风琴的表单数据将插入到 headerFields 数组中。通过每个唯一的键..
    • 更改一个手风琴的数据反映在另一个手风琴中的原因是因为您将所有 URL 输入绑定到一个单一模型(即 headerFields.url)。同样,所有方法输入都绑定到同一个模型(即 headerFields.method)。我在上面分享的 sn-p 将创建一个 headerFields 模型数组,以便每个手风琴都可以映射到自己独特的 headerField 模型。如果问题不是我们所理解的,您能详细说明一下吗?
    【解决方案2】:

    改用表单数组怎么样?

    文件组件.ts

    export class AppComponent {
    
    
    form: FormGroup;
    
      constructor(private fb: FormBuilder) {
        this.form = fb.group({
          config: fb.array([])
        });
      }
    
      addNewAddressGroup() {
        const add = this.form.get('config') as FormArray;
        add.push(
          this.fb.group({
            url: [],
            type: []
          })
        );
      }
    
      deleteAddressGroup(index: number) {
        const add = this.form.get('config') as FormArray;
        add.removeAt(index);
      }
    }
    

    文件 html.ts

    <div [formGroup]="form">
      <div>
        <button (click)="addNewAddressGroup()">Add</button>
      </div>
    
      <div
        *ngFor="let addressGroup of form.get('config').controls;let i = index"
        [formGroup]="addressGroup">
        
        <div>Url <input formControlName="url" /></div>
        <div>Type <input formControlName="type" /></div>
        <button (click)="deleteAddressGroup(i)">Delete</button>
      </div>
    </div>
    
    result <br />
    
    <pre>
    {{form.value | json}}
    </pre>
    

    你可以看看这个Demo

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    • 感谢您的回复。我编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2021-07-30
    • 2021-10-02
    相关资源
    最近更新 更多