Я думаю, что люди в целом борются с чем-то вроде этого, потому что они очень привыкли делать привязку данных старомодным, ручным способом.Чтобы добиться успеха в Angular, нужно забыть старые пути и принять новые.В противном случае вы получите страшную ошибку ExpressionChangedAfterItHasBeenCheckedError
.
Angular обрабатывает привязку данных за вас.
Когда вы используете [(ngModel)]
, синтаксис содержит двустороннюю привязку данных.[]
указывает на привязку ваших данных к элементу управления.()
означает привязку элемента управления обратно к вашим данным.[(ngModel)]
реализован для всех стандартных элементов управления HTML-формой.
Когда флажок установлен, выражение в ngModel
запускается для установки свойства в классе модели.Это также работает в обратном порядке - когда вы изменяете свойство базового класса данных, оно отражается в форме HTML.
Таким образом, у нас есть две реализации:
- Вообще говоря, вы не манипулируете элементами HTML напрямую - Angular делает это за вас.
- Для синхронизации представления и модели данных больше не требуется ручная разводка кода.
Чтоделать?
Здесь действительно есть один вариант.Вам нужно иметь объект для сопоставления с тем, выбран ли автор:
authors = [ { author: {...}, isSelected: false} ];
Затем ваш ngFor
будет использовать это в качестве входных данных:
<div>
<mat-checkbox class="authors-checkboxes" *ngFor="let item of authors" [(ngModel)]="item.isSelected">{{ item.author.name }}</mat-checkbox>
</div>
Обратите внимание также , что Angular не поддерживает смешивание ngModel
и FormGroup
.Если вам нужно использовать FormGroup
, вы должны продолжить в этом направлении, но вам все равно нужно будет создать промежуточный класс, который будет содержать информацию о том, выбран ли данный автор.См. Больше - https://blog.angular -university.io / введение в угловые 2 формы, управляемое шаблоном, по сравнению с моделью /