我有一个mat radio组组件,它还呈现一个表单字段列表

<form *ngIf="myRatesForm.controls.items.controls.length > 0" [formGroup]="myRatesForm">
  <mat-radio-group formArrayName="items">
    <div [formGroupName]="i" *ngFor="let myRate of myRatesForm.controls.items.controls; let i = index">
      <mat-radio-button [checked]="myRate.isFavorite" formControlName="isFavorite" [value]="myRate">
        <div class="flex">
          <mat-form-field appearance="outline">
            <input formControlName="name" matInput placeholder="Taux" />
          </mat-form-field>
          <div (click)="inputFocus($event)">
            <mat-form-field appearance="outline">
              <input formControlName="rateValue" matInput placeholder="Taux" />
            </mat-form-field>
          </div>
        </div>
      </mat-radio-button>
    </div>
  </mat-radio-group>
</form>

在我的ts文件中,我正在创建一个动态的formArray

itemsForm: FormArray = this.fb.array([]);
myRatesForm = new FormGroup({
  items: this.itemsForm,
});
constructor(private store: Store, private pricesSelector: PricesSelector, private fb: FormBuilder) {}

myRates: MyRates[] = [];
subscription$: Subscription = new Subscription();
favoriteRate: MyRates;
ngOnInit(): void {
  this.subscription$ = this.store.select(this.pricesSelector.getPriceTaxValue).subscribe(data => {
    this.myRates = data.myRates;
    this.myRates.map(rate => {
      this.myRatesForm.controls.items.push(
        this.fb.group({
          name: [rate.name, Validators.required],
          rateValue: [rate.rateValue, Validators.required],
          isFavorite: [rate.isFavorite],
        })
      );
    });
  });
}

实际上Name和rateValue formControl正在工作.

但radioButton isFavorite不工作.我得到了这个错误

NG01203:表单控件路径没有值访问器:'items—2—>> 是最喜欢的.了解更多

我认为becauseFormControlName不是设置在mat-radio-group

有没有办法做到?

推荐答案

单选组是mat单选按钮的逻辑分组,所以我们需要将单选组移动到一个单独的表单控件<代码>favourited,这将包含所选的值,然后我们可以渲染单选按钮没有表单控件名称!

工作示例提供代码和stackblitz!

代码

ts

<代码>import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import {
  FormArray,
  FormBuilder,
  FormControl,
  FormGroup,
  FormsModule,
  ReactiveFormsModule,
  Validators,
} from '@angular/forms';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatRadioModule } from '@angular/material/radio';
import { MatInputModule } from '@angular/material/input';
import { Subscription } from 'rxjs';

/**
 * @title Radios with ngModel
 */
@Component({
  selector: 'radio-ng-model-example',
  templateUrl: 'radio-ng-model-example.HTML',
  styleUrl: 'radio-ng-model-example.css',
  standalone: true,
  imports: [
    FormsModule,
    CommonModule,
    MatFormFieldModule,
    MatRadioModule,
    MatInputModule,
    ReactiveFormsModule,
  ],
})
export class RadioNgModelExample {
  itemsForm: FormArray = this.fb.array([]);
  myRatesForm = new FormGroup({
    favourited: new FormControl(),
    items: this.itemsForm,
  });
  constructor(private fb: FormBuilder) {}

  myRates: any[] = [];
  subscription$: Subscription = new Subscription();
  favoriteRate: any;

  ngOnInit(): void {
    this.myRates = [
      { name: 'test1', rateValue: 1, isFavorite: true },
      { name: 'test2', rateValue: 2, isFavorite: false },
      { name: 'test3', rateValue: 3, isFavorite: false },
    ];
    this.myRates.map((rate) => {
      this.myRatesForm.controls.items.push(
        this.fb.group({
          name: [rate.name, Validators.required],
          rateValue: [rate.rateValue, Validators.required],
          isFavorite: [rate.isFavorite],
        })
      );
    });
  }
}

HTML

<代码>{{myRatesForm.value | json}}

<form
  *ngIf="myRatesForm.controls.items.controls.length > 0"
  [formGroup]="myRatesForm"
>
  <mat-radio-group formControlName="favourited">
    <div formArrayName="items">
      <div
        [formGroupName]="i"
        *ngFor="let myRate of myRatesForm.controls.items.controls; let i = index"
      >
        <mat-radio-button
          [value]="myRates[i]"
          [checked]="myRates[i].isFavorite"
        ></mat-radio-button>
        <div class="flex">
          <mat-form-field appearance="outline">
            <input formControlName="name" matInput placeholder="Taux" />
          </mat-form-field>
          <div>
            <mat-form-field appearance="outline">
              <input formControlName="rateValue" matInput placeholder="Taux" />
            </mat-form-field>
          </div>
        </div>
      </div>
    </div>
  </mat-radio-group>
</form>

Stackblitz Demo

Angular相关问答推荐

RXJS运算符用于combineLatest,不含空值

垫-菜单未以17.2.3角显示

Angular 17不接受带点(.)的路径在开发环境中,它直接抛出一个404错误

使用jsPDF生成带有图像的PDF时出现灰色条纹

如果Rxjs间隔请求仍在进行,则不应重置,但如果用户更改输入,则应重置

基于RxJS的Angular 服务数据缓存

用于 React 的 ngx-extended-pdf-viewer

在Angular中扩展多个类

ngRouterOutlet和组件生命周期使用自定义模板渲染的问题

Angular Signals 如何影响 RXJS Observables 以及在这种情况下变化检测会发生什么

NX如何在前端和后端使用一个接口库

Angular 15 Ref 错误:初始化前无法访问组件 A

以 Angular 形式添加动态控件失败

Angular 13 - 使用 PUT 时出现 400 错误(错误请求)

包含与 ngFor 相关内容的 HTML 输入

无法卸载 angular-cli

可从 Angular2 中的

Angular 中 polyfills.ts 文件有什么用

我应该在 Angular 4+ 应用程序中 for each 组件创建一个模块吗?

如何防止角material垫菜单关闭?