Angular 10 复选框值变得未定义

标签 angular

我在组件中配置了以下 formGroup:

  constructor(private apiService: ApiService) {
    this.form = new FormGroup({
      product: new FormControl(),
      shops: new FormGroup({})
    });
  }

当我从选择栏中选择供应商时,我想将其所有商店作为复选框加载。 在加载复选框的函数中,我填写了表单组:

  loadShops(product: string): void {
    this.apiService.getShopsThatSellProduct(product).subscribe({
      next: data => {
        this.shops = data;
        const checkboxes: FormGroup =  this.form.get('shops') as FormGroup;
        checkboxes.reset();
        this.shops.forEach((shop, index) => {
          checkboxes.addControl('shop_' + index, new FormControl(shop));
        });
      }
      ,
      error: err => {
        console.log(err.message);
      }
    });
  }

在我的 html 中,我使用了以下代码:

  <div class="shops">
    <mat-form-field>
      <mat-select placeholder="Shops"  >
        <mat-option formGroupName="shops" *ngFor="let someFormControl of form.get('shops').value | keyvalue">
          <mat-checkbox  [formControlName]="someFormControl.key"> {{someFormControl.value.name}}</mat-checkbox>
        </mat-option>
      </mat-select>
    </mat-form-field>
  </div>

每个商店都有以下字段:

{
name: string
owner: string
address : string
}

选择产品后,商店列表会更新。但是,默认情况下会选择所有商店,当我尝试选择/取消选择任何商店选项时,该值将变为未定义。

为什么每个选项第一次“取消选择”后{{someFormControl.value.name}}变得未定义?

stackbiz example

最佳答案

您误解了表单控件值是什么。您使用此代码创建了一个表单控件:

checkboxes.addControl('shop_' + index, new FormControl(shop));

这将创建一个初始值为 shop 的 FormControl,它是一个如下所示的对象:

{
  name: 'Dan',
  age: 30
}

所以首先,你的商店被选中是因为这个对象是真实的。取消选择它后,它将更改为:false,因此someFormControl.value.name将变得未定义(因为false.name未定义),这样你的标签就会消失。

要修复此问题,您可以将 new FormControl(shop) 更改为 new FormControl(false) 以使其在启动时处于未选中状态,并更改 someFormControl.value。 namesomeFormControl.index 以将人名显示为标签。 (或 data['USA'][i].age 将年龄显示为标签。)

See It On stackblitz

关于 Angular 10 复选框值变得未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63488538/

相关文章:

angular - 像 *ngIf 一样使用 'as'

angular - 在 Angular 4 中使用 Fabric.js

angular - Angular-in-memory-web-api 中的多个集合

unit-testing - 使用 Jasmine spy "No provider for Http!"错误的 Angular 2 组件测试

css - npm bootstrap 版本 (4.1.0) 没有将所有 css 属性添加到 css 'background' 标签

http - 如何从angular2中的WebMethod获取数据

node.js - 将 outdir 中 ng build 生成的工件复制到另一个文件夹

javascript - 由于过滤器导致表达式更改而导致 *ngIf 的渲染延迟 - Angular

SonarQube 6.x 的 Angular2 插件

html - url中没有哈希的Angular2