Angular2 / 4 mat-select множественный ngModel

У меня есть раскрывающийся список выбора матов с несколькими включенными, и я использую NgModel для хранения выбранных пользователем значений.

Проблема в том, что когда я перехожу на другую страницу и возвращаюсь, выбранные пользователем значения отсутствуют в mat-select .. Я знаю, что ngModel имеет эти значения ... Мне что-то не хватает ...

HTML

<mat-form-field>
 <mat-select placeholder="Customers" name="customerDetails" ngDefaultControl       
 formControlName="customerDetails" [(ngModel)]="custonerDetails" 
 [formControl]="customerDetailsCtrl" multiple   
 (ngModelChange)="onCustomerValueChanges(customer)" >
 
  <mat-option *ngFor="let customer of customerDetailsResult"
  [value]="customer">{{customer.CustomerNo}}- 
                     {{customer.CustomerDescription}}
   </mat-option>
 </mat-select>
</mat-form-field>

Любые идеи?


person Maiur Laximidas    schedule 10.10.2017    source источник
comment
опечатка в [(ngModel)] = custonerDetails?   -  person Michele Sapignoli    schedule 10.10.2017
comment
@MicheleSapignoli Опечатка при публикации здесь ... верна в коде   -  person Maiur Laximidas    schedule 10.10.2017
comment
См. Ответ @Andrey Kolybelnikov ниже. Это решает проблему.   -  person choopage - Jek Bao    schedule 20.04.2018


Ответы (3)


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

Ознакомьтесь с официальной документацией по Angular здесь.

В демо-приложении Material2 есть пример функции с двумя реализациями. Это здесь.

В моем компоненте у меня есть коллекция объектов User [люди] для опций выбора мата. Компонент получает набор выбранных объектов User [пользователей] в качестве входных данных из предыдущего состояния. Достаточно справедливо, объекты в [люди] и объекты в [пользователи] имеют разные идентификаторы, и подмножество в множественном выборе по умолчанию не инициализируется с установленными флажками.

Итак, волшебный compareWith просто буквально сравнивает объекты по некоторым заданным значениям и возвращает истину или ложь, а флажки на подмножестве [люди] получают статус выбранных. В моем коде я решил использовать привязку [(ngModel]):

<mat-form-field>
    <mat-select [compareWith]="compareFn" name="users" [(ngModel)]="users" multiple>
        <mat-option *ngFor="let person of people" [value]="person">
           {{ person.username }}
        </mat-option>
   </mat-select>
</mat-form-field>

И в файле .ts я использую функцию из документа Angular, чтобы вернуть истину, если два объекта User имеют одинаковый идентификатор:

compareFn(user1: User, user2: User) {
    return user1 && user2 ? user1.id === user2.id : user1 === user2;
}

Если у вас есть аналогичный вариант использования, он может работать из коробки.

Что касается заметки о том, что находится под капотом, compareWith вызвало у меня любопытство. Я выяснил, что он основан на функции в Angular2 под названием looIdentical (посмотрите здесь), который, в свою очередь, является производным от идентичной библиотеки Dart.js от Google. Его можно найти здесь.

person RedDree    schedule 06.04.2018
comment
почти потратить 2 часа после того, как я найду этот ответ, он работает очень хорошо. спасибо @reddree. 1 лайк от меня. - person Sachin from Pune; 09.10.2018
comment
Сэкономил кучу времени! - person Brian Smith; 20.01.2020

Пожалуйста, проверьте [(ngModel)]="custonerDetails". Я думаю, что есть орфографическая ошибка, и вы также можете использовать ее как [(value)]="custonerDetails".

person manish sharma    schedule 03.04.2018

Если вы уверены, что ngModel имеет значение. Проблема может заключаться в том, что свойство [value] опции mat теряет этот выбор.

Попробуй это:

[ngValue]="customer" instead of [value]= "customer"
person Shailesh Nayak K    schedule 11.10.2017