Как отобразить уже выбранный угловой компонент mat-chip?

#angular #angular-components

#угловой #угловые компоненты

Вопрос:

Я хотел бы отобразить список mat-чипов, которые уже выбраны, когда пользователь открывает диалоговое окно на основе свойства «доступно».

Вот мой HTML-шаблон:

 `
  

   <mat-chip-list formControlName="sizes" #chipList [multiple]="true" [selectable]="true">

      <mat-chip #chipRef
        *ngFor="let gearSize of gearItemForm.controls['sizes'].value"
        [ngClass]=""
        [selected]="gearSize.available"  
        (click)="gearSize.available = !gearSize.available; onSelectedChipSize()"  
        [color]="gearSize.color">{{ sizeEnum[gearSize.size] }}, {{ gearSize.available }}  
      </mat-chip>

    </mat-chip-list>

      <input
        matInput
        formControlName="sizes"
        placeholder="Gear sizes..."
        [matChipInputFor]="chipList"
        style="display: none;"
        class="gear-size-label"
      >

    <mat-error *ngIf="gearItemForm.get('sizes').invalid amp;amp; gearItemForm.get('sizes').touched">Please select a size</mat-error>

  </mat-form-field>     
`
  

Всякий раз, когда gearSize.available есть true или false , это не влияет на [selected] свойство mat-chip , и компонент chip никогда не выбирается. Пользователю всегда приходится физически изменять цвет чипа вручную. Как я могу отобразить уже выбранный mat-chip список, если available свойство является true ?

Комментарии:

1. Это определенно должно сработать. Это работает с примером на material.angular.io если вы используете true или false в selected свойстве: stackblitz.com/angular /…

2. итак, вместо того, чтобы просто использовать атрибут selected в качестве директивы, можете ли вы передать ему функцию, которая принимает значение true или false? У меня есть объект, свойство которого может изменяться в зависимости от того, какой элемент вы выберете. Интересно, может быть, моя привязка к свойству просто неправильная

3. По крайней мере, в этом фрагменте кода нет ничего плохого. Выбранное состояние изменится в соответствии с gearSize.available . Но есть вещи, которые могут помешать шаблону отображать изменения ( OnPush стратегия, например).

4. позвольте мне обновить мой шаблон в вопросе. я думаю, это связано с тем, что я использую mat-form-field. Проблема заключается в ‘formControlName=sizes’, как только я его удаляю, он работает так, как ожидалось

5. Конечно. Вы должны ввести элемент управления во входные данные, и он не будет содержать список добавленных микросхем (вы должны управлять им параллельным способом).

Ответ №1:

Я попытался создать базовый POC, чтобы проверить ваши потребности. Вот как выглядит реализация. В компоненте у меня есть массив объектов, подобных этому:

  import {Component} from '@angular/core';

 /**
  * @title Basic chips
  */
 @Component({
    selector: 'chips-overview-example',
    templateUrl: 'chips-overview-example.html',
    styleUrls: ['chips-overview-example.css'],
  })
  export class ChipsOverviewExample {

     gearItem = [{'item': 'gearItem1', value: true},{'item': 'gearItem2', value: 
                 false}];
  }  
  

А затем в html:

    <mat-chip-list>
      <mat-chip *ngFor="let gearSize of gearItem" [selected]="gearSize.value"></mat-chip>
   </mat-chip-list>  
  

Кажется, это работает нормально, и рабочая ссылка на stackblitz находится здесь: MatchipImplementation

Комментарии:

1. Я думаю, проблема заключается в том, как я синхронизирую массив с формой. Я просто заметил, что ранее у меня был basic FormControl , в который я затем вставил массив. Это отлично работало для того, что я делал в то время, однако теперь это ломается. Я пробовал это, но это все равно не сработало. this.gearItemForm = this.fb.group({ name: this.fb.control(name, Validators.required), price: this.fb.control(price, Validators.required), sizes: this.fb.array(sizes, this.requireSize()), inStock: this.fb.control(inStock), images: this.fb.array(images) })