【发布时间】: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