有没有更好的方法将值推送到表单控件,其中数组作为 Angular 中的值

Posted

技术标签:

【中文标题】有没有更好的方法将值推送到表单控件,其中数组作为 Angular 中的值【英文标题】:Is there a better way to push a value to a form control with an array as a value in Angular 【发布时间】:2021-11-14 14:51:20 【问题描述】:

我目前有一个多选列表,我想从组件中添加一个值。我现在这样做的方式不会在 UI 上更新,也不会运行我的自定义验证器。如果我控制表单控件的值,它会显示正确的值。有没有更好的方法来做到这一点,或者任何人都可以解释为什么会发生这种情况?

<mat-form-field appearance="fill">
  <mat-label>Toppings</mat-label>
  <mat-select [formControl]="toppings" multiple>
    <mat-option *ngFor="let topping of toppingList" [value]="topping">
      topping
    </mat-option>
  </mat-select>
</mat-form-field>
<br />
<button (click)="add()">Add Onion To List</button>
export class SelectMultipleExample 
      toppings = new FormControl([]);
      toppingList: string[] = [
        'Extra cheese',
        'Mushroom',
        'Onion',
        'Pepperoni',
        'Sausage',
        'Tomato',
      ];
    
      ngOnInit() 
        this.toppings.addValidators(this.validator);
      
    
      add() 
        this.toppings.value.push('Onion');
        console.log(this.toppings.value);
      
    
      validator(control: AbstractControl): ValidationErrors | null 
        console.log('Checked');
        return null;
      

https://stackblitz.com/edit/angular-dwztco?file=src/app/select-multiple-example.ts

【问题讨论】:

【参考方案1】:

您需要致电FormControl.setValue 进行更新。 FormControl.value 应该是只读的。

改变

this.toppings.value.push('Onion');

this.toppings.setValue([...this.toppings.value,"Onion"]);

请注意,这会在多次单击按钮时将重复值“洋葱”添加到列表中,但是当您手动选择列表中的某些内容时,重复值会自动删除。无论如何,这超出了这个问题的范围。

【讨论】:

以上是关于有没有更好的方法将值推送到表单控件,其中数组作为 Angular 中的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将值推送到 Cypher 中的属性数组?

将值推送到猫鼬模式中对象内的数组

如何将值推送到 QML 属性变量二维数组 - 动态?

如何按键过滤数组并使用javascript将值推送到另一个数组

将值推送到辅助数组javascript

将值推送到复选框或单选更改上的数组的功能