#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) })