Использование ngValue с автозаполнением Angular Material?

Я передаю объект как свое значение, и мне нужно использовать [ngValue] вместо [value].

Мой HTML выглядит так:

<mat-input-container fxFlex = "18" fxFlexOffset = "1">
    <input
        matInput
        placeholder = "Example"
        [matAutocomplete] = "autocomplete"
        [ngModel] = "user?.UserName"
        (ngModelChange) = "filter($event)"
        [disabled] = "disabled"/>
     <mat-autocomplete #autocomplete = "matAutocomplete" 
                       (optionSelected) = "optionSelected($event)" >
         <mat-option *ngFor = "let selectedUser of availableUsers" [ngValue] = "selectedUser">
             <span>{{ selectedUser?.UserName }}</span>
         </mat-option>
     </mat-autocomplete>
</mat-input-container>

В качестве демонстрации у меня также есть stackblitz с моей ошибкой, представленной здесь: https://stackblitz.com/edit/angular-5wk4rl?file=app%2Fautocomplete-simple-example.html

Я получаю сообщение об ошибке:

Ошибки разбора шаблона:

Can't bind to 'ngValue' since it isn't a known property of 'mat-option'.

1. If 'mat-option' is an Angular component and it has 'ngValue' input, then verify that 
   it is part of this module.
2. If 'mat-option' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the 
   '@NgModule.schemas' of this component to suppress this message.
3. To allow any property add 'NO_ERRORS_SCHEMA' to the 
   '@NgModule.schemas' of this component.

Как упоминалось в другом ответе в стеке, Angular — невозможно привязать к «ngValue», так как это неизвестное свойство «mat-option»

Пользователи предполагают, что добавление его в файл модулей решит проблему, но когда я попробовал это (как видно из моего material-module.ts в моем stackblitz), ошибка сохраняется.

Какие-либо предложения? Буду признателен за любую помощь!

Вы не можете использовать привязку свойства ngValue с опцией mat, потому что предполагается, что она будет использоваться только с элементом option. mat-option берет [value] крепления

yurzui 28.06.2019 20:52

Почему вы хотите иметь объекты в качестве значений параметров автозаполнения (вместо строк)?

ConnorsFan 28.06.2019 20:56

@ConnorsFan, потому что иногда в моделях данных используются объекты, а не строки.

G. Tranter 28.06.2019 20:58

@ConnorsFan Я обновил html в своем примере, чтобы уточнить

Jett 28.06.2019 21:00
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
4
1 435
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
 <mat-option *ngFor = "let option of options" [value] = "option">

Ознакомьтесь с документацией здесь: https://material.angular.io/components/autocomplete/обзор

Чтобы использовать объект:

<mat-autocomplete #auto = "matAutocomplete" [displayWith] = "displayFn">
  <mat-option 
    *ngFor = "let selectedUser of availableUsers" [value] = "selectedUser">
      {{selectedUser.name}}
  </mat-option>
</mat-autocomplete>

в файле xxx.ts:

displayFn(user?): string | undefined {
  return user ? user.name : undefined;
}

Да - это работает. Мне интересно, есть ли способ заставить [ngValue] работать вместо [value].

Jett 28.06.2019 20:55

Нет. Как вы думаете, зачем вам это нужно?

G. Tranter 28.06.2019 20:56

зачем вам нужно использовать [ngValue]?

katwhocodes 28.06.2019 20:57

если я использую [value] = "selectedUser", то, хотя раскрывающийся список заполнен правильно, мой выбор отображается как «[object Object]» вместо имени пользователя пользователя. Хотя теоретически я мог бы использовать [value] = "selectedUser?.UserName" - при сохранении я хотел бы сохранить весь объект целиком - и передать объект, а не только имя пользователя, потому что есть другие раскрывающиеся списки с другим атрибутом на «Пользователь», который можно изменить

Jett 28.06.2019 21:10

Понимаю. Вы можете попробовать это, просто отобразите в нем имя, вы все равно передаете объект [value]: <mat-option *ngFor = "let option of group.options" [value] = "option"> {{option.name }} </mat-опция>

katwhocodes 28.06.2019 21:30

Используйте <mat-autocomplete [displayWith] = "displayFn" ...>. См. material.angular.io/components/autocomplete/….

G. Tranter 28.06.2019 21:45

@katwhocodes да - извините, я забыл упомянуть, я обновил html в своем посте, чтобы уточнить, что у меня есть прямо сейчас

Jett 28.06.2019 22:10

@Jedo Я вижу, тогда ты можешь использовать displayWith. я обновил ответ

katwhocodes 28.06.2019 22:20

@katwhocodes спасибо за предложение! работает :)

Jett 28.06.2019 22:55

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