Angular mat-input связывает [значение] с [(ngModel)]

У меня есть эта таблица:

<table class = "mat-elevation-z8">
          <tr *ngFor = "let prescription of prescriptions" class = "mat-row">
            <td>
              <mat-form-field class = "">
                <input  [value] = "prescription.description" matInput placeholder = "Description">
              </mat-form-field>
            </td>
            <td>
              <mat-form-field class = "">
                  <mat-select>
            <mat-option *ngFor = "let object of selectedObjects" [value] = "object.id" [(ngModel)] = "prescription.idObject">
              {{object.description}}
            </mat-option>
          </mat-select>
        </mat-form-field>   
            </td>
            <td>
              <button mat-button class = "delete" (click) = "check(prescription)">delete</button>
            </td>
          </tr>
        </table>

где мои рецепты массива имеют эту структуру:

 prescriptions = [
    {
      id: 1,
      description: "Prescrizione 1",
      date1: new Date(),
      date2: new Date(),
      idObject: 0
    },
    {
      id: 2,
      description: "Prescrizione 2",
      date1: new Date(),
      date2: new Date(),
      idObject: 0
    }
  ]

Каждая строка таблицы представляет объект этого массива. В каждой строке есть элемент mat-select, который берет свои параметры из этого массива selectedObjects:

"selectedObjects": [
        {
            "id":1, "description": "Desc1"
          },
          {
            "id":2, "description": "Desc2"
          },
          {
            "id":3, "descrizione": "Desc3"
          }

Чего я хочу добиться, так это привязать значение выбранного параметра, то есть object.id к свойству idObject элемента строки. Итак, я использовал [value] = "object.id" [(ngModel)] = "prescription.idObject", но это не работает, так как свойство остается равным 0 для всех строк. Я проверил это, напечатав свойство в методе check (то есть для каждой строки).
Есть ли способ реализовать такую ​​привязку?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
3 743
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно поставить ngModel на выбор, а не на опцию. Это ваш выбор, который «меняется» и устанавливается каждый раз, когда вы выбираете опцию, а не саму опцию. Посмотрите на этот пример: https://stackblitz.com/angular/vkkalkxbmrok?file=app%2Fselect-form-example.ts

Обновлено: хорошо, я понял, что вы пытаетесь сделать здесь. Вы хотите установить idObject внутри каждого предписания. Привязка ngModel к выбору скопирует весь выбранный объект из selectedObjects, а не только идентификатор:

{"id":2, "description": "Desc2"}

Я не уверен, что вы можете указать, что мне просто нужен подобъект этого выбора, но это идеальный случай, когда вы можете использовать:

(selectionChange) = "setPrescriptionId($event, prescription)"

Angular 6 Метод изменения выбора материала удален.

Это будет вызываться каждый раз, когда ваш выбор изменяется.

public setPrescriptionId(event: {id:string, description: string}, prescription: IYourPrescriptionInterface) {
    prescription.idObject = event.id;
}

Другие вопросы по теме