微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在此FormArray以我的反应形式更改后,为什么从JSON文件中检索对象时会收到此错误消息?

如何解决在此FormArray以我的反应形式更改后,为什么从JSON文件中检索对象时会收到此错误消息?

我正在使用反应式表单并引入 FormArray (因为存在将一个字段动态创建为多个字段的情况),因此我正在研究Angular项目。

基本上到定义我的HTML代码的表单中,我都有这样的东西:

<div class="col-10">
    <ng-container *ngFor="let commessa of commessaList.controls; index as idx">
    <div class="row">
    <div class="col-sm-8">
      <input type="text" [ngClass]="{'error':commessa.invalid && commessa.touched}"
                 [formControlName]="idx"
                 class="form-control" id="commessa">
    </div>

    <div class="col-sm-2">
      <button type="button" *ngIf="idx===0" (click)="addCommessaField()" class="btn btn-success"
        [ngClass]="'pad'"><i class="fa fa-plus-circle" aria-hidden="true"></i></button>

      <button (click)="deleteCommessaField(idx)" *ngIf="idx!==0" class="btn btn-danger">
        <i class="fa fa-trash" aria-hidden="true"></i>
      </button>
    </div>
    </div>
    </ng-container>

    </div>
</div>

此部分用于定义表单的突出显示部分(我可以在其中添加多个“ Commessa”字段:

enter image description here

然后在我的TypeScript代码中定义了我用来定义表单字段和相关验证规则的 orderForm:FormGroup; 对象,将其设置为 ngOnInit()方法

ngOnInit() {

    this.orderFormValues = new OrderFormValues();

    console.log("orderFormValues VALUES: " + this.orderFormValues.statoOrdine);

    this.orderForm = this.fb.group({
    idOrdine: [null,[Validators.required]],dataInserimentoOrdine: [new Date(),statoOrdine: [null,[Validators.required,Validators.minLength(5)]],//commessa: [null,commessaList: new FormArray([
    new FormControl('',Validators.minLength(5)])
    ]),CIG: [null,Validators.pattern("^[a-zA-Z0-9]{10}$")]],dataInizioAttivita: [null,dataFineAttivita: [null,referente: [null,ruoloReferente: [null,tipologiaDiPartecipazione: [null,quotaPercentualeDiRTI: [null,[Validators.max(100)]],cliente: [null,vatCliente: [null,clienteFinale: [null,[]],vatClienteFinale: [null,tipologiaContratto: [null,importoContratto: [null,linkContratto: [null,dataSottoscrizioneContratto: [null,nomeSocieta: [null,vatSocieta: [null,buName: [null,presenzaAQ: [false,linkIdentificativoAQ: [null,accordoQuadro: [null,residuoAccordoQuadro: [null,compagineDiAQ: [null,[]]

    });



    this.ordeRSService.getAllOrders().then(orders => {
        this.orders = orders;
        console.log("RETRIEVED ORDERS: ",orders);
        this.loading = false;
    });

        .........................................................................................
        .........................................................................................
        .........................................................................................
}

您可以在 FormGroup 定义中看到,与多个“ Commessa”字段相关的部分通过以下方式定义为 FormArray

commessaList: new FormArray([
    new FormControl('',Validators.minLength(5)])
]),

为完整性起见,我补充说,然后在我的TypeScript代码中,我还具有这两种方法,用于将用户插入的值插入此 FormArray 的多个 Commessa 字段中对象:

addCommessaField() {
    this.commessaList.push(new FormControl('',Validators.minLength(5)]));
}

deleteCommessaField(index: number) {
    if (this.commessaList.length !== 1) {
        this.commessaList.removeAt(index);
    }
    console.log(this.commessaList.length);
}

正如您在我的 ngOnInit()方法中的上一代码段中所看到的,我也正在执行对 OrderService 对象的调用

this.ordeRSService.getAllOrders().then(orders => {
    this.orders = orders;
    console.log("RETRIEVED ORDERS: ",orders);
    this.loading = false;
});

调用只是检索显示首页中的订单列表(此刻已被模拟为JSON文件),在这里我得到一个奇怪的错误

我的 getAllOrders()服务方法代码就是这样的:

getAllOrders() {
    return this.http.get<any>('assets/json_mock/ordini.json')
    .toPromise()
    .then(res => <Order[]>res.data)
    .then(data => { return data; });
}

如您所见,它从此 ordini.json 文件中检索并返回订单。

问题在于,调用 getAllOrders()服务方法会检索订单列表,但是在Chrome控制台中,我也会收到以下错误消息:

core.js:6228 ERROR Error: Cannot find control with name: '0'
    at _throwError (forms.js:3576)
    at setUpControl (forms.js:3398)
    at FormGroupDirective.addControl (forms.js:7679)
    at FormControlName._setUpControl (forms.js:8451)
    at FormControlName.ngOnChanges (forms.js:8368)
    at FormControlName.wrapOnChangesHook_inPrevIoUsChangesstorage (core.js:26966)
    at callHook (core.js:4730)
    at callHooks (core.js:4690)
    at executeInitAndCheckHooks (core.js:4630)
    at selectIndexInternal (core.js:9748)

奇怪的是,发生在我使用以前的 FormArray 实现了多个“ Commessa”字段之后(在我只有一个“ Commessa”输入字段并且没有这个错误之前) 。我怀疑错误可能出在我的原始JSON内容中,但我不明白为什么以及如何解决此问题。

跟随我的 ordini.json 文件内容

{
  "data": [
    {
      "id": 1,"referente": {
        "name": "Mario","surname": "Rossi","complete_name": "Mario Rossi","role": "Operation Manager","avatar": "mario-rossi.jpg"
      },"company": {
        "name": "TEST S.p.A.","VAT": "IT 03318271214","BU": {
          "name": "Digital Solution","code": "DS"
        }
      },"dettaglio_ordine": {
        "data_inserimento": "08/08/2020","commessa": {
          "code": "AAA0001"
        },"identificativo_contratto_hyperlink": "LINK-ID-CONTRATTO-TEST","tipologia_contratto": "ORDINE","presenza_AQ": true,"identificativo_AQ_hyperlink": "LINK-AQ-TEST","accordo_quadro": 12,"importo_contratto": 122000,"residuo_AQ": 20000,"compagine_di_AQ": "COMPAGINE-DI-AQ-TEST","quota_percentuale_di_RTI": 20,"tipologia_di_partecipazione": "Gara PUBBLICA","cig": "CIG-TEST-1","cliente": "CLIENTE-TEST-1","vat_cliente": "VAT-CLIENTE","cliente_finale": "CLIENTE-FINALE-TEST-1","vat_cliente_finale": "VAT-CLIENTE-FINALE","data_sottoscrizione_contratto": "8/12/2020","data_inizio_attivita": "8/28/2020","data_fine_attivita": "8/31/2020","stato_ordine": "CHIUSO"
      }
    },{
      "id": 2,"company": {
        "name": "Blabla S.p.A.","BU": {
          "name": "Cyber Security","code": "CS"
        }
      },"dettaglio_ordine": {
        "data_inserimento": "09/08/2020","commessa": {
          "code": "AAA0002"
        },"presenza_AQ": false,"cig": "CIG-TEST-2","vat_cliente": "VAT CLIENTE TEST","cliente_finale": "CLIENTE-FINALE-TEST-2","vat_cliente_finale": "VAT-CLIENTE-FINALE-TEST",{
      "id": 3,"referente": {
        "name": "Francesco Nicola","surname": "Romano","complete_name": "Francesco Verdi","avatar": "francesco-romano.jpg"
      },"dettaglio_ordine": {
        "data_inserimento": "10/08/2020","cig": "CIG-TEST-3","cliente": "CLIENTE-TEST-3","vat_cliente": "XXX123","cliente_finale": "CLIENTE-FINALE-TEST-3","vat_cliente_finale": "YYY321","stato_ordine": "CHIUSO"
      }

    }
  ]
}

您可以在此JSON文件中定义的对象中看到, commessa 字段是通过以下方式定义的:

"commessa": {
    "code": "AAA0002"
},

也许是错误的,或者问题出在其他地方。

我想念什么?为什么会出现此错误?我该如何解决错误

解决方法

您缺少html中的 formArrayName div。

确保使用 formArrayName =“ commessaList”

封装HTML
<div formArrayName="commessaList">
  <div class="form-group row">
    <label for="commessa" class="col-sm-2 col-form-label">Commessa</label>
    <div class="col-sm-10">
      <ng-container *ngFor="let commessa of commessaList.controls; index as idx">
        ................
        ................
      </ng-container>
    </div>
  </div>
</div>
,

您忘记使用吸气剂吗?

get comessaList()
{
   return this.orderForm .get("comessaList") as FormArray
}

为避免出现初始错误,可以使用* ngIf

<div *ngIf="orderForm" [formGroup]="orderForm">
....
</div>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?