【问题标题】:Assigning formControlName dynamically in nested Angular formGroups在嵌套的 Angular formGroups 中动态分配 formControlName
【发布时间】:2018-11-18 09:39:37
【问题描述】:

我想使用formGroupformArray 在angular6 中动态创建input 表单上设置formControlNameplaceholder

component.html:

 <form [formGroup]="ecosystemFormG" novalidate>  
        <div  formArrayName="transactions">
            <div  [formGroupName]="i" *ngFor="let transaction of getTransactions(ecosystemFormG); let i = 'index'">
                <div>
                    <!-- Dropdownselect for transactionVintage  Calling methd (transactionVintageMethod)-->
                </div>
                <div formArrayName="transactionVintageValues">
                    <div   [formGroupName]="j" *ngFor="let value of getTransactionVintage(transaction); let j = 'index'">
                        [[ value.placeholder ]] -->not printing anything
                                        [[ value.ctrlname ]]-->not printing
                                        [[ j ]] [[value]]
                                        <mat-form-field color="accent">
                                            <input matInput [placeholder]="value.placeholder" [formControlName]="value.ctrlname">  
                                        </mat-form-field>  <--throwing error  -->

                    </div> 
                </div>
            </div>
        </div>  
</form>


 [[ecosystemFormG.value | json]]

这是正在创建的 Json[[ecosystemFormG.value | json]]

{"transactions": [
        { 
          "transactionVintage": 3, 
          "transactionVintageValues": [
            {
              "ctrlName": "ctrlname_1",
              "placeholder": "plcaholder1"
            },
            {
              "ctrlName": "ctrlname_2",
              "placeholder": "plcaholder2"
            },
            {
              "ctrlName": "ctrlname_3",
              "placeholder": "plcaholder3"
            }
          ]
        }
      ]
}

组件.ts

    export class EcosystemComponent implements OnInit {

    ecosystemFormG: FormGroup;

    getTransactions(form) { 
      return form.controls.transactions.controls;
    } 

    getTransactionVintage(form) { 
      return form.controls.transactionVintageValues.controls;
    }

    transactionVintageMethod(_event, _transactionForm, i){ 
        let _ctrls = this.getTransactionVintage(_transactionForm); 
        this.remove(i);
        for(var l=1; l<=_event.value; l++) { 
            this.add(i,l);
        }
    }

    remove(i){
         // remove all input fields 
    }

    add(i,l) { 
      const control = <FormArray>this.ecosystemFormG.get('transactions')['controls'][i].get('transactionVintageValues');
      //some unknown logic to put formConetrolName and placeholder
      control.push(this.initTransactionVintageValues(l));
    }

    initTransactions() {
        return new FormGroup({ 
          transactionVintage: new FormControl(''), 
          transactionVintageValues: new FormArray([])
        });
    }

    initTransactionVintageValues(l) { 
        let ctrlname = "ctrlname_" + l;
        let plcaholder =  "plcaholder" + l

       return new FormGroup({
         ctrlName: new FormControl(ctrlname), 
         placeholder : new FormControl(plcaholder)
       });
    }

    ngOnInit() { 
        this.ecosystemFormG = new FormGroup({ 
          transactions: new FormArray([
            this.initTransactions(),
          ]),
        });
    }
}

我在 json 中的 transactionVintage 键是 html 中的数字下拉选择器,它告诉要创建的输入字段的数量。

在这里,我可以创建动态输入字段。

所以问题是我们如何为动态创建的输入字段分配 formControlName 和 plcaholder。

【问题讨论】:

    标签: angular angular-forms angular6


    【解决方案1】:

    为什么不只使用普通绑定?

    <div   [formGroupName]="j" *ngFor="let value of getTransactionVintage(transaction); let j = index">
        <mat-form-field color="accent">
            <input matInput [placeholder]="value.placeholder" [formControlName]="value.ctrlname"> 
        </mat-form-field> 
    </div> 
    

    另外,为什么'index'*ngFor 中有单引号?那里不需要单引号。

    *ngFor="let item of items; let i = index"
    

    *ngFor="let user of users; index as i"
    

    【讨论】:

    • value.placeholder 和 value.ctrlname 没有给我任何价值它的空。所以得到错误 ERROR 错误:找不到带有路径的控件:' transactions -> 0 -> transactionVintageValues -> 0 -> '
    • 用硬编码值检查,如 ctrlName: new FormControl("ctrlname"), placeholder : new FormControl("plcaholder")
    • 我在 .ts 文件中更新了一点点,以显示我如何添加 ctrlname 和占位符
    • 您能否像这样编辑您的答案 [placeholder]="value.value.placeholder" 和 [formControlName]="value.value.ctrlname" 您的答案是正确的。谢谢
    • 我会要求您更改您的代码,以便您可以以value.ctrlname 的身份访问它。 value.value.ctrlname 听起来不太好。另外,为什么你有一个formControl 作为占位符?
    猜你喜欢
    • 2018-09-02
    • 1970-01-01
    • 2021-09-27
    • 2018-05-06
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 2021-12-01
    相关资源
    最近更新 更多