Угловые флажки для проверки при загрузке

#angular #checkbox #angular-reactive-forms #angular-forms

#угловые #флажок #угловые реактивные формы #угловые формы

Вопрос:

нужна ваша помощь

У меня есть массив значений флажков

 colors = ['Black', 'Red', 'White', 'Blue', 'Yellow', 'Grey'];
  

Реализовал их в HTML

 <div *ngFor="let color of colors; let i = index" class="checkbox">
        <label>
          <input type="checkbox" class="colors" [value]="color" (change)="addCheckboxData($event)" />
          {{ color }}
        </label>
      </div>
  

Итак, это выглядит так:
введите описание изображения здесь

У меня есть массив значений, которые следует проверять при загрузке страницы

   checkedValues = ['Black', 'White', 'Grey'];
  

Я добавил их в formarray

 color: this._formBuilder.array(this.checkedValues),
  

Это работает, и color formarray имеет значения, как в массиве checkedValues:
введите описание изображения здесь

Но флажки не установлены, поэтому я хочу, чтобы эти значения отображались как отмеченные. Как я могу это сделать? Спасибо

Ответ №1:

вам нужно передать массив логических значений

 color: this._formBuilder.array(
              this.colors.map(x=>this.checkedValues.indexOf(x)>=0)),
  

И управляйте формой, как

 <form [formGroup]="form">
    <input formControlName="name">
    <div formArrayName="color">
        <div *ngFor="let control of colorFormArray.controls;let i=index">
            <input type="checkbox" [formControlName]="i">{{colors[i]}}
      </div>
        </div>
</form>
<pre>
{{form?.value|json}}
</pre>
  

Ну, вы видите, что «color» получает в качестве значения массив логических значений, например [true,false,true,false,false,true]

И вы хотите, чтобы этот цвет получал массив с цветами, поэтому идея заключается в том, чтобы иметь FormControl, а не FormArray, и использовать [ngModel] и (ngModelChange). Поскольку мы используем [ngModel] внутри FormGroup, нам нужно использовать [ngModel]="{standalone:true}"

Посмотрите форму и .html

 this.form2=this._formBuilder.group({
  name:[],
  color:[this.checkedValues] //<--see that is a simple FormControl
})

<form [formGroup]="form2">
        <div *ngFor="let col of colors;let i=index">
            <input type="checkbox" 
           [ngModel]="form2.get('color').value amp;amp; form2.get('color').value.indexOf(col)>=0" 
           (ngModelChange)="colorChange($event,i)"
           [ngModelOptions]="{standalone:true}"
                 
      >{{colors[i]}}
        </div>
</form>
  

[ngModel] имеет значение true или false в зависимости от form2.get('color').value.indexOf

Функция colorChange получила значение флажка и индекс

   colorChange(checked:boolean,index:number)
  {
    const checkedColors=this.form2.get('color').value || [] //the actual value of the formControl
                                                            //if is null an empty array
    const color=this.colors[index];  //the color selected

    ///if is checked and is not in the array
    if (checked amp;amp; checkedColors.indexOf(color)<0)
    {
      //concatenate to the value the new color
      //and sort the result array 

      const orderColors=[...checkedColors,color]
                  .sort((a,b)=>this.colors.indexOf(a)-this.colors.indexOf(b))

      //make a setValue
      this.form2.get('color').setValue(orderColors)
    }

    //if not checked

    if (!checked)
      this.form2.get('color').setValue(checkedColors.filter(x=>x!=color))

  }
  

В стекблите у вас есть два подхода

ПРИМЕЧАНИЕ: В этом втором подходе мы можем сделать так, что если нет выбора цвета, значение элемента управления становится нулевым. Это позволяет нам использовать Validators.required , например, только изменить функцию colorChange

   colorChange(checked:boolean,index:number)
  {
        ...

    if (!checked)
    {
      const result=checkedColors.filter(x=>x!=color)
      this.form2.get('color').setValue(result.length>0?result:null)
    }

  }