ng-select - очень гибкий компонент для сравнения элементов в массиве.
Вот функция findItem , которая отвечает за это сравнение:
findItem(value: any): NgOption {
let findBy: (item: NgOption) => boolean;
if (this._ngSelect.compareWith) {
findBy = item => this._ngSelect.compareWith(item.value, value)
} else if (this._ngSelect.bindValue) {
findBy = item => !item.children && this.resolveNested(item.value, this._ngSelect.bindValue) === value
} else {
findBy = item => item.value === value ||
!item.children && item.label && item.label === this.resolveNested(value, this._ngSelect.bindLabel)
}
return this._items.find(item => findBy(item));
}
Как видите, оно следует следующим правилам:
1) Используйте функцию compareWith
, если имеется, иначе
2) Используйте bindValue
, если имеется, иначе
3) Используйте bindLabel
, если имеется
В вашем первом элементе управления, который не использует шаблонное выражение, вы передали bindLabel
, поэтому он работает правильно. Если вы добавите тот же вход ко второму элементу управления, он будет работать
Разветвленный стек-блиц
Если вы хотите сохранить выбранное значение как массив объектов, я бы порекомендовал вам использовать compareWith
input
HTML
<ng-select
...
[compareWith]="compareWith"
ц
compareWith(item, selected) {
return item.id === selected.id
}
Пример Stackblitz
в противном случае используйте bindValue