【问题标题】:TypeError: this.receivedSummons.map is not a function AngularTypeError:this.receivedSummons.map 不是 Angular 函数
【发布时间】:2020-01-10 01:26:38
【问题描述】:

我正在尝试在FormArray 上绑定动态checkboxes,当我在stackblitz 上重现它的工作时,但在我的IDE 上显示错误,我使用的是Array.prototype.map 而不是rxjs map,我得到了console.log 中的错误:

core.js:9110 ERROR TypeError: this.receivedSummons.map 不是函数

console.log(this.receivedSummons),我得到了这个,

console.log(JSON.stringify(this.receivedSummons.data));,我得到了这个, [![console.log(JSON.stringify(this.receivedSummons.data));][2]][2]

这是我尝试过的:

Ts 文件

receivedSummons: SummonModel[];
  selectedSummons: string;
  checkboxForm: FormGroup;

  get formReceivedSummons() {
    return this.checkboxForm.get('receivedSummons') as FormArray;
  }

  formReceivedSummonsItems(i: number) {
    return (this.formReceivedSummons.controls[i].get('items')) as FormArray;
  }

  constructor(
    private inquiryStore: InquiryStoreService,
    private formBuilder: FormBuilder
  ) { }

  ngOnInit() {
    this.checkboxForm = this.formBuilder.group({
      receivedSummons: this.formBuilder.array([])
    });
    this.getReceivedSummons();
  }

  getReceivedSummons() {
    this.inquiryStore.summons$.subscribe(receivedSummons => {
      this.receivedSummons = receivedSummons;
      this.addCheckboxes();
    });
  }

  addCheckboxes() {
    this.formReceivedSummons.setValue([]);
    this.receivedSummons.map(checkbox => {
      const group = this.formBuilder.group({
        header: [checkbox.header.transactionId],
        items: this.formBuilder.array([], [minSelectedCheckboxes(1)])
      });
      checkbox.data.items.map(items => {
        (group.get('items') as FormArray).push(this.formBuilder.group({
          name: [items.itemNo],
          isChecked: ['']
        }));
      });
      this.formReceivedSummons.push(group);
    });
  }

  submitSelectedCheckboxes() {
    console.log(this.checkboxForm.value);
  }
}

function minSelectedCheckboxes(min = 1) {
  const validator: ValidatorFn = (formArray: FormArray) => {
    const totalSelected = formArray.controls
      .map(control => control.value)
      .reduce((prev, next) => (next ? prev + next : prev), 0);

    return totalSelected >= min ? null : { required: true };
  };
  return validator;
}

HTML 文件

<form [formGroup]="checkboxForm" (ngSubmit)="submitSelectedCheckboxes()">
    <ng-container formArrayName="receivedSummons" *ngFor="let summon of formReceivedSummons.controls; let i = index">
        <ng-container [formGroup]="summon">
            <p>{{summon.value.header}}</p>
            <ng-container formArrayName="items"
                *ngFor="let item of formReceivedSummonsItems(i).controls; let j = index">
                <ng-container [formGroup]="item">
                    <input type="checkbox" formControlName="isChecked"> {{item.value.name}}
                </ng-container>
            </ng-container>
        </ng-container>
        <div *ngIf="!summon.valid">At least one order must be selected</div>
    </ng-container>
    <br>
    <button [disabled]="!checkboxForm.valid">submit</button>
</form>

这是我使用stackblitz 复制的内容,我可以就如何解决这个问题提供一些指导和建议。谢谢

【问题讨论】:

  • 你有什么错误,在哪里?
  • @HugoNoro 在 console.log core.js:9110 错误类型错误:this.receivedSummons.map is not a function
  • 你能把你在 this.recievedSummons 中的内容发布出来
  • 我不是角度开发人员,但这经常发生,最初您的变量不存在或包含空值。由于 angular/React 恰好是反应式的,最初当组件 unMount 时,您的变量将不存在或没有数据(因此不会是数组)。

标签: javascript angular typescript array.prototype.map


【解决方案1】:

从您发布的 JSON 看来,this.receivedSummons 不是一个数组,.map 在一个数组上工作,将您的代码更改为

this.receivedSummons.data.items.map(checkbox =

【讨论】:

  • 仍然出现错误TypeError: Cannot read property 'items' of undefined
  • 等一下,你可以发布你在执行时得到的内容 console.log(JSON.stringify(this.receivedSummons.data));
  • 我在ide 中有字符串数组,但是当我尝试stackblitz 演示时,我得到了undefined
  • 发布你在 ide 中得到的内容
  • 试试 this.receivedSummons.data['items'].map
猜你喜欢
  • 2015-09-01
  • 2018-03-19
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 2019-07-09
相关资源
最近更新 更多