ReactiveForms với các mẫu đệ quy động


8

Đây là vấn đề của tôi.

Ví dụ trực tuyến về vấn đề

Tôi có một JSON động mà tôi cần chuyển đổi thành một biểu mẫu. Vì vậy, tôi đã sử dụng các biểu mẫu phản ứng và bằng cách đi qua tất cả các thuộc tính của JSON, tôi tạo một Formgroup hoặc FormControl, theo cách này:

sampleJson ={prop1:"value1", prop2: "value2",...}

...

  myForm: FormGroup;
  myKeys=[];
    ...

  ngOnInit() {
    this.myForm = this.getFormGroupControls(this.sampleJson, this.myKeys);

  }

getFormGroupControls(json:any,keys): FormGroup{
    let controls = {};
    let value = {};

    for (let key in json) {
      if (json.hasOwnProperty(key)) {

        value = json[key];
        if (value instanceof Object && value.constructor === Object) {

          keys.push({"key":key,children:[]});
          controls[key] = this.getFormGroupControls(value,keys[keys.length-1].children);
        } else {

          keys.push({"key":key,children:[]});
          controls[key] = new FormControl(value);

        }
      }
    }

    return new FormGroup(controls);
  }

Sau khi làm như vậy, tôi sử dụng các mẫu đệ quy để xây dựng biểu mẫu, nếu tôi không sử dụng các mẫu đệ quy, tôi sẽ nhận được biểu mẫu để làm việc. Tuy nhiên với các mẫu đệ quy tôi đang gặp lỗi:

<form [formGroup]="myForm">

  <div class="form-group">


    <ng-template #nodeTemplateRef let-node>

      <div class="node">
        <div  *ngIf="node.children.length">
          {{"section [formGroupName]="}} {{ getNodeKey(node) }}
          <section style="display:block;margin:20px;border:solid 1px blue;padding-bottom: 5px;"
            [formGroupName]="getNodeKey(node)" >
            <h1>{{ node.key }}</h1>
            <ng-template
              ngFor
              [ngForOf]="node.children"
              [ngForTemplate]="nodeTemplateRef">
            </ng-template>
          </section>
          {{"end of section"}}
        </div>
        <div  *ngIf="!node.children.length">
          <label [for]="node.key">{{node.key}}</label>&nbsp;
          <input  type="text" [id]="node.key"
                  class="form-control">
        </div>
      </div>

    </ng-template>

    <ng-template *ngFor="let myKey of myKeys"
                 [ngTemplateOutlet]="nodeTemplateRef"
                 [ngTemplateOutletContext]="{ $implicit: myKey   }">
    </ng-template>

  </div>

CựuComponent.html: 25 Lỗi LRI: Không thể tìm thấy điều khiển với tên: 'đường'

Điều đó tương ứng với JSON mẫu này:

"address": {
        "town": "townington",
        "county": "Shireshire",

        "road": {
          "number": "1",
          "street": "the street"
        }

Tôi đã được hiển thị, vì vậy tôi biết các yếu tố ở đó. Tôi đang thiếu gì?


Tôi tin [formGroupName]="road"là không biết rằng nó được lồng trong nhóm address. Đó là tìm kiếm một nhóm định dạng được đặt tên roadtrực tiếp dưới thư mục gốc [formGroup]="myForm". Nếu bạn lồng một roadnhóm định dạng ngay bên dưới myForm, bạn sẽ thấy lỗi không còn xuất hiện nữa.
Alex K

Thay thế formGroupNamebằng formGroupmọi nơi có thể khắc phục vấn đề. Nhưng bạn sẽ cần một cách để lấy FormGroupví dụ chính xác cho từng nhóm lồng nhau.
Alex K

tạo ra lỗi khác này> Không thể tạo thuộc tính 'trình xác thực' trên chuỗi 'tên'
Dalorzo

json năng động sẽ luôn trả về một bộ đã biết? Điều đó có thể thay đổi nhưng chúng ta có thể nhận thức được chúng và có loại nào an toàn không?
maxime1992

Tôi đoán những gì tôi hỏi là: là nó thực sự năng động hoặc là nó chỉ là một oneOftừ một tập gọi các mục có thể như name, personal, addressvv
maxime1992

Câu trả lời:


2

Hoặc nếu bạn vẫn muốn phân cấp nhóm biểu mẫu / điều khiển, bạn có thể sử dụng các lệnh của formgroup và formControl bằng cách chuyển chúng theo cách đệ quy (thay vì formgroupName và formControlName)

Liên kết ngăn xếp

NB: cùng một vấn đề ở đây: ReactiveForm đệ quy không thể tìm thấy formgroup bên trong mẫu


1
+1 này là một giải pháp ấn tượng ..
Dalorzo

Điều này đã kết thúc hoạt động tốt hơn nhiều và yêu cầu ít thay đổi hơn cho mục tiêu ban đầu của tôi. Đó là lý do tại sao tôi trao giải cho phản hồi vì tôi nghĩ nó chính xác hơn
Dalorzo

9

Vấn đề với mã hiện tại của bạn dường như là ng-template cha là thành phần ứng dụng của bạn, vì vậy nó không tính đến các formgroupNames khác trong các mẫu hàng đầu bạn đã xác định và luôn tìm kiếm trong Formgroup gốc.

Dường như tên nhóm / tên điều khiển đầy đủ không được hỗ trợ trong các mẫu (ví dụ: không thể sử dụng formGroupName="address.road")

Nếu bạn cần một số lý do formgroup - bạn có thể chuyển chúng trong ngữ cảnh cho các mẫu. Hoặc bạn có thể giải quyết trực tiếp formControls:

  • xóa tất cả formGroupNamekhỏi mẫu
  • lưu trữ fullPath: keys.push({"key":key,children:[], fullKey: parent ? parent.fullKey + '.' + key: key});(bạn cũng có thể lưu trữ FormControlví dụ.)
  • và sử dụng nó: <input type="text" [formControl]="myForm.get(node.fullKey)"

Ví dụ về Stackblitz

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.