Текстовое поле с ngModel перезаписывается в цикле ngFor

#javascript #angular

#javascript #угловатый

Вопрос:

Я только начал работать над проектом Angular. В следующем коде я хотел бы использовать ngFor и ngModel для итерации массива и поместить значение элемента в качестве значения по умолчанию для текстовой области. И у меня есть пример с двумя значениями в массиве, все текстовые области всегда перезаписываются одним из них вместо отображения разных значений на веб-сайте. Кто-нибудь знает, что может быть возможной причиной этого?

       <mat-form-field *ngFor = "let item of model.answers; let index = index;" class="example-full-width" appearance="fill">
        <mat-label>Cluster Answer</mat-label>
        <textarea
          matInput
          id="{{item['id']}}"
          rows="7"
          placeholder="Cluster answer"
          [(ngModel)]="model.answers[index]['answer']"
          name="clusterAnswer"
          formControlName="clusterAnswer"
        ></textarea>
        <mat-hint>Define the cluster answer to be suggested</mat-hint>
      </mat-form-field>
 

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

1. попробуйте [(ngModel)]=»item.answer»

2. Я пробовал [(ngMdoel)]=»item.answer», все то же самое.

Ответ №1:

вы должны определить значение в построителе форм в ts, а не в html:

 exampe.formBuilder{
test:[defaultValue]
}
 

Ответ №2:

у вас уже есть ngModel, поэтому нет необходимости указывать formControlName, использование [(ngModel)] с formControlName устарело

     <mat-form-field *ngFor = "let item of model.answers; let index = index;" class="example-full-width" appearance="fill">
            <mat-label>Cluster Answer</mat-label>
            <textarea
            matInput
            [id]="item['id']"
            rows="7"
            placeholder="Cluster answer"
            [(ngModel)]="model.answer"
            ></textarea>
            <mat-hint>Define the cluster answer to be suggested</mat-hint>
        </mat-form-field>
 

Ответ №3:

Вам необходимо указать другое значение атрибута name для каждой отдельной итерации, поскольку значение ngModel использует значение атрибута name для подключения нового элемента управления с предоставленным именем к форме.

В вашем случае даже нет необходимости использовать двустороннюю привязку данных (бананна в поле [(ngModel)]), потому что у вас уже есть состояние формы внутри самой формы, поэтому вы можете просто использовать [ngModel] для привязки значения, если оно есть, и когда захотитечтобы получить новые значения, которые вы можете использовать @ViewChild(NgForm) form: NgFrom для получения формы из вашего представления (вероятно, будет лучше запросить ее, используя имя переменной шаблона. Это будет выглядеть примерно так <form #f="ngForm"> , где f находится ваша переменная шаблона. Также проверьте дочерний декоратор представления) или внутри события ngSubmit вашей формы вы можете указать значение формы, используя переменную шаблона. <form #f="ngForm" (ngSubmit)="submitHandler(f.value)"> .

Я не рекомендую использовать двустороннюю привязку данных, потому что происходит то, что мы храним одни и те же значения в двух разных местах:

  • состояние каждого отдельного элемента управления ngModel, который у нас есть
  • внутри состояния вашего компонента.

Также директива formControlName поступает из реактивных форм, и нехорошо смешивать оба типа форм внутри одной формы.

 <mat-form-field *ngFor="let item of model.answers; let i = index;" class="example-full-width" appearance="fill">
  <mat-label>Cluster Answer</mat-label>
    <textarea
       matInput
       [id]="item['id']"
       rows="7"
       placeholder="Cluster answer"
       [ngModel]="model?.answers?[i]?['answer']"
       [name]="'clusterAnswer'   i"
    ></textarea>
  <mat-hint>Define the cluster answer to be suggested</mat-hint>
</mat-form-field>