角反应形式,从数据库中填充formArray内的formArray

时间:2019-12-10 19:17:56

标签: javascript angular

我在另一个需要从数据库填充的表单数组中有一个formArray,因此在加载表单时会显示公司数据

具有这种结构:

 "groups": [
    {
      "defaultGroup": true,
      "name": "string",
      "prestationNames": [
        "string"
      ],
    }
  ],

所以我确实喜欢这个.ts文件:

export class UpdateSocieteComponent implements OnInit {
  updateSocieteForm: FormGroup;
  // societeReference: String;

  listOfPrestation;

  societe = {};
  constructor(
    private societeServ: SocieteService,
    private serviceServ: ServiceService,
    private formBuilder: FormBuilder,
    private router: Router,
    private route: ActivatedRoute
  ) {}

  ngOnInit() {
    //subscribe to route param:
    this.route.paramMap.subscribe((param: ParamMap) => {
      const societeReference = param.get("societeReference");

      if (societeReference) {
        this.getCompany(societeReference);
      }
    });
    //init the form
    this.initForm();
  }

  getCompany(comapnyRference) {
    this.societeServ.getCompanyByReference(comapnyRference).subscribe(
      data => {
        console.log(data);
        //pass the data to editCompany function
        this.editCompany(data);
      },
      err => {
        console.log(err);
      }
    );
  }

  //edit the company
  editCompany(company) {
    this.updateSocieteForm.patchValue({
      name: company.name,
      code: company.code,
      activityField: company.activityField,
      description: company.description,
      domainName: company.domainName,
      principalAddress: {
        street: company.principalAddress.street,
        postalCode: company.principalAddress.postalCode,
        region: company.principalAddress.region
      }
    });
    // polatute adresses formArray:
    this.updateSocieteForm.setControl(
      "addresses",
      this.populateAdresses(company.addresses)
    );
    //populate group formArray:
    this.updateSocieteForm.setControl(
      "groups",
      this.populateGroups(company.groups)
    );
  }

  populateGroups(groups) {
    let formArray = new FormArray([]);

    groups.map(element => {
      formArray.push(
        this.formBuilder.group({
          name: element.name,
          defaultGroup: element.defaultGroup,
          prestationNames: this.formBuilder.array([
            this.updateSocieteForm.setControl(
              "prestationNames",
              this.populatePrestation(element.prestationNames)
            )
          ])
        })
      );
      console.log("prestation names", element.prestationNames);
    });

    return formArray;
  }

  populatePrestation(controls): FormArray {
    let formArray = new FormArray([]);

    console.log("contorls", controls);
    controls.map(element => {
      formArray.push(this.formBuilder.control(element.name));
    });

    console.log("form array", formArray);
    return formArray;
  }

  populateAdresses(adresses): FormArray {
    let formArray = new FormArray([]);

    adresses.map(element => {
      formArray.push(
        this.formBuilder.group({
          street: element.street,
          postalCode: element.postalCode,
          region: element.region
        })
      );
    });

    return formArray;
  }

  initForm() {
    this.updateSocieteForm = this.formBuilder.group({
      name: ["", [Validators.required]],
      code: ["", [Validators.required, codeSocieteValidator]],
      activityField: ["", [Validators.required]],
      description: ["", [Validators.required]],
      domainName: ["", [Validators.required]],
      addresses: this.formBuilder.array([]),
      groups: this.formBuilder.array([
        // this.formBuilder.group({
        //   name: ["", [Validators.required]],
        //   defaultGroup: [true, []],
        //   prestationNames: this.formBuilder.array([])
        // })
      ]),
      principalAddress: this.formBuilder.group({
        street: ["", [Validators.required]],
        postalCode: ["", [Validators.required, postalCodeValidator]],
        region: ["", [Validators.required]]
      })
    });
  }
  //clear field
  revert() {
    this.updateSocieteForm.reset();
  }

  get prestationNames(): FormArray {
    return this.updateSocieteForm.get("prestationNames") as FormArray;
  }

  get prestationNamesControls() {
    return this.updateSocieteForm.get("prestationNames")["controls"];
  }

  //get principal adress fields
  get principalAdress() {
    return this.updateSocieteForm.get("principalAddress") as FormGroup;
  }

  // get controls for principal adress fields
  get principalAdressControls() {
    return this.updateSocieteForm.get("principalAddress")["controls"];
  }

  // get form controls
  get f() {
    return this.updateSocieteForm.controls;
  }

  // get adresses formArray
  get addresses(): FormArray {
    return this.updateSocieteForm.get("addresses") as FormArray;
  }

  // get groups formArray
  get groups(): FormArray {
    return this.updateSocieteForm.get("groups") as FormArray;
  }

  // get controls for groups formArray
  get groupsControls() {
    return this.updateSocieteForm.get("groups")["controls"];
  }

  get asdressControls() {
    return this.updateSocieteForm.get("addresses")["controls"];
  }

  addAdress() {
    const newAdress = {
      street: "",
      postalCode: "",
      region: ""
    };
    // this.arrayOfadresses.push(newAdress);
    this.addresses.push(this.formBuilder.group(newAdress));
  }

  //TODO
  addGroup() {
    this.serviceServ.getAllprestations().subscribe(data => {
      this.listOfPrestation = data;
      let chekControls = this.listOfPrestation.map(element =>
        this.formBuilder.control(element.name)
      );
      const newGroup = {
        name: ["", Validators.required],
        defaultGroup: false,
        prestationNames: this.formBuilder.array(chekControls) // TODO : pu validation here for number of chekboxes selected
      };

      this.groups.push(this.formBuilder.group(newGroup));
    });
  }

  removeGroup(index) {
    this.groups.removeAt(index);
  }

  removeAdress(index) {
    this.addresses.removeAt(index);
  }

  onSubmitForm() {
    console.log(this.updateSocieteForm.value);
  }
}

.html与组和prestationNames有关(prestationNames formArray嵌套在组formArray中):

<div class="row" formArrayName="groups">
                   <div *ngFor="let group of groups.controls; let i=index"
                   [formGroup]="groups.controls[i]" class="row">
                           <div class="col-2">
                             <div class="form-group mt-4">
                                  <div class="custom-control custom-checkbox">
                                    <input type="checkbox" class="custom-control-input" formControlName="defaultGroup" >
                                    <label class="custom-control-label" for="defaultChecked2">Groupe par defaut</label>
                                  </div>
                             </div>
                           </div>
                          <div class="col-3">
                             <div class="form-group">
                                <label
                                [class.text-danger]="groupsControls[i].invalid &&(groupsControls[i].touched || groupsControls[i].dirty)"
                                 for="name"> Nom groupe</label>
                                <input
                                [class.is-invalid]="groupsControls[i].invalid &&(groupsControls[i].touched || groupsControls[i].dirty)"
                                 class="form-control" formControlName="name" type="text">
                             </div>
                             <div *ngIf="groupsControls[i].invalid &&(groupsControls[i].touched || groupsControls[i].dirty)">
                                 <small class="text-danger" *ngIf="groupsControls[i].invalid">
                                     nom requis
                                 </small>

                             </div>
                          </div>

                           <div class="col border col-prestations d-flex flex-row" formArrayName="prestationNames">
                               <div class="row" *ngFor="let prestation of group.get('prestationNames').controls; let nameIndex=index"

                               >
                                <div class="col-5">
                               <div class="form-group">
                                   <div class="checkbox">
                                      <label><input [formControlName]="nameIndex" value="nameIndex"  type="checkbox">{{nameIndex.controls}}</label>

                                    </div> 


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

                           </div>
                           <div class="col-2 mt-2">
                             <div class="form-group">
                             <button
                            type="button"
                              class="btn btn-default mt-4 add-remove-button group-button"
                              (click)="removeGroup(i)"
                            >
                              -
                            </button>

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

我认为我正确地填充了prestationNames formArray,这是我使用populatePrestation方法填充时从控制台获取的信息:

公司有两个组,name和defaultGroup字段已加载并正确显示。 我的问题是prestationNames:它显示在控制台中,所以我认为它的数据已正确加载 但以形式错误地绑定。 我想念东西

console and interface

0 个答案:

没有答案