Angular 2 Form “Cannot find control with path”

前端 未结 5 1491
无人共我
无人共我 2020-11-30 03:36

I try to make a dynamic form (so you can limitless add items to a list), but somehow the content of my list is not getting send because it can\'t find the control with path:

相关标签:
5条回答
  • 2020-11-30 04:16

    There should be a formControlName in your HTML form mapped to your component file.

    <div *ngFor="let list_item of [0,1,2]; let i=index" class="panel panel-default">
      {{i + 1}}.) <input type="text" formControlName="{{i}}" placeholder="List Item" class="form-control">
    </div>
    
    list_items: this.fb.array([
        [''], //0 points to this
        [''], //1 points to this
        [''] //2 points to this
    ])
    
    0 讨论(0)
  • 2020-11-30 04:25

    Note that if your FormArray contains other FormGroup controls (which contain other instances of FormControl), you'll need to do this to access the controls inside each FormGroup:

            <div *ngFor="let item of myFormArray.controls; let i=index">
                <div formGroupName="{{i}}">
                    <input formControlName="myFormGroupSubControl1" />
                    <input formControlName="myFormGroupSubControl2" />
    
    0 讨论(0)
  • 2020-11-30 04:26

    You must use the interpolation.

    Instead of:

        <div
          class="form-group"
          *ngFor="let hobbyControl of getControls(); let i = index">
          <input type="text" class="form-control" formControlName="i">
        </div>
    

    You must use the interpolation with "formControlName":

        <div
          class="form-group"
          *ngFor="let hobbyControl of getControls(); let i = index">
          <input type="text" class="form-control" [formControlName]="i">
        </div>
    

    If you're a using a recent version of Angular, make sure to do the operations in the TypeScript file, instead of in the Web page, as shown below in the file "app.component.ts":

      getControls() {
        return (<FormArray>this.signupForm.get('hobbies')).controls;
      }
    
    0 讨论(0)
  • 2020-11-30 04:29

    I also encountered this error, and I solved this problem by initiating the variables of class(elements in this.fb.array([])).

    Code Snippet

        mobileNumbers: this.fb.array([this.fb.group(new MobileNumber('IN'))]),
    

    Where class MobileNumber is used.

    export class MobileNumber{
        public country_code: string;
        public mobile_number: string;
        constructor($cc){
            this.country_code = COUNTRY_CODES[$cc];
        }
    }
    

    To

    export class MobileNumber{
        public country_code = '';
        public mobile_number = '';
        constructor($cc){
            this.country_code = COUNTRY_CODES[$cc];
        }
    }
    
    0 讨论(0)
  • 2020-11-30 04:31

    A simple example with FormArray @ stackblitz (gist'd below)

    app.component.ts

    import { Component,OnInit } from '@angular/core';
    import { FormGroup, FormControl, FormArray, FormBuilder, Validators } from '@angular/forms';
    
    @Component({
      selector: 'my-app',
      templateUrl: './app.component.html',
      styleUrls: [ './app.component.css' ]
    })
    export class AppComponent implements OnInit {
      fg: FormGroup;
      constructor(private fb: FormBuilder){}
      ngOnInit() {
      this.fg = this.fb.group({
        address: this.fb.group({
          street: ['', Validators.required],
        }),
        aliases: this.fb.array([])
      });
      const fa = (this.fg.get('aliases')as FormArray);
      this.addNewAlias();
      }
      addNewAlias(){
        const fa = (this.fg.get('aliases')as FormArray);
        fa.push(this.fb.group({
          name: ['', Validators.required]
        }));
      }
      deleteAlias(i:number){
        const fa = (this.fg.get('aliases')as FormArray);
        fa.removeAt(i);
        if(fa.length===0) this.addNewAlias();
      }
    }
    

    app.component.html

    <form [formGroup]="fg" class="spaced">
      <h3>Nested in Group:</h3>
      <div formGroupName="address" class="spaced">
        <label>
          <input type="text" formControlName="street">
          valid: {{fg.get('address').get('street')?.valid}}
        </label>
      </div>
      <h3>Nested in Array:</h3>
      <div formArrayName="aliases" *ngFor="let alias of fg.get('aliases').controls; let i = index;" class="border">
        <div [formGroupName]="i">
          <label>
            Alias {{i+1}}:
            <input formControlName="name" placeholder="Item name">valid: {{alias.get('name')?.valid}}
          </label>
          <button type="button" (click)="deleteAlias(i)">X</button>
        </div>
      </div>
      <button type="button" (click)="addNewAlias()">add</button>
    </form>
    <div>form valid: {{fg?.valid}}</div>
    
    0 讨论(0)
提交回复
热议问题