#angular #angular9
#angular #angular9
Вопрос:
Ниже я не понимаю, почему я получаю ошибку компиляции Cannot use variable 'ft' as the left-hand side of an assignment expression. Template variables are read-only.
Если я удалю банановый синтаксис и оставлю его как [fileType] , то у меня нет ошибок, но когда я изменяю значение из элемента управления Select в дочернем компоненте, элемент в родительской коллекции fileTypes не обновляется. Как мне это сделать, чтобы родительская коллекция обновлялась?
родительский компонент
<app-file-type-list-item class="form-row align-items-end" *ngFor="let ft of fileTypes" [(fileType)]="ft"></app-file-type-list-item>
дочерний компонент
<select name="fileType01" id="fileType01" [(ngModel)]="fileType" (change)="onFileTypeChange()">
<option *ngFor="let fileType of fileTypes" [ngValue]="fileType">
{{fileType.name}}</option>
</select>
export class FileTypeListItemComponent {
@Input() public fileType: FileType;
@Output() fileTypeChange = new EventEmitter();
public fileTypes;
constructor(private _entityManagerService: POPEntityManagerService) {
this.fileTypes = // filled from datasource
onFileTypeChange(): void {
this.fileTypeChange.emit(this.fileType);
}
}
Комментарии:
1. Какую версию Angular вы используете?
2. Я использую версию 9
Ответ №1:
Можете ли вы попробовать использовать этот синтаксис:
<app-file-type-list-item class="form-row align-items-end" *ngFor="let ft of fileTypes; let i = index" [(fileType)]="fileTypes[i]"></app-file-type-list-item>
В случае, если это не работает, пожалуйста, предоставьте подробную информацию о параметрах компилятора Angular на случай, если эти параметры не включены
"fullTemplateTypeCheck": true,
"strictInjectionParameters": true
Комментарии:
1. Да, этот синтаксис, похоже, работает. Ошибок нет, и коллекция родительских компонентов обновляется. Я могу удалить
let ft of filetTypes
часть, я думаю? Я не знал об этом синтаксисе, это «формальный» способ делать что-то?2. @Sam дело в том, что у вас есть переменная шаблона, такая же, как у компонента prop. Если вы прочитали руководство по совместимости Angular Ivy, вы можете увидеть, что в нем указано: «Теперь ошибочно присваивать значения переменным только для шаблонов, таким как item в ngFor=»пусть item of items» (ранее компилятор игнорировал эти назначения)». next.angular.io/guide/ivy-compatibility
3. вы правы. Я об этом не знал. Раньше я делал это повсеместно в своих приложениях, так что это немного неудобно. Кроме того, я понимаю, что это эволюция Ivy, но было бы хорошо, если бы команда Angular предоставила «официальный» способ исправить эту ошибку. Я думаю, ваш способ хорош, я просто надеюсь, что он не нарушает никаких принципов angular
4. Я знаю, они пытались изменить и сгенерировать лучшую ошибку для этого, но все же. Вы можете увидеть поток об этом: github.com/angular/angular/pull/34339