Я хотел бы привязать элемент select к списку объектов - это достаточно просто:
@Component({
selector: 'myApp',
template: `<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
<option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
</select>`
})
export class AppComponent{
countries = [
{id: 1, name: "United States"},
{id: 2, name: "Australia"}
{id: 3, name: "Canada"},
{id: 4, name: "Brazil"},
{id: 5, name: "England"}
];
selectedValue = null;
}
В этом случае оказывается, что selectedValue
это будет число - идентификатор выбранного элемента.
Тем не менее, я бы хотел связать сам объект страны, чтобы selectedValue
он был объектом, а не идентификатором. Я попытался изменить значение параметра следующим образом:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
но это не похоже на работу. Кажется, в моем месте находится объект, selectedValue
но не тот, который я ожидаю. Вы можете увидеть это в моем примере с Plunker .
Я также попытался привязаться к событию изменения, чтобы я мог сам установить объект на основе выбранного идентификатора; однако, похоже, что событие изменения запускается до обновления связанной ngModel - это означает, что у меня нет доступа к вновь выбранному значению в этой точке.
Есть ли чистый способ привязать выбранный элемент к объекту с Angular 2?
Ответы:
Пример StackBlitz
ПРИМЕЧАНИЕ: вы можете использовать
[ngValue]="c"
вместо[ngValue]="c.id"
где c - полный объект страны.[value]="..."
поддерживает только строковые значения[ngValue]="..."
поддерживает любой типОбновить
Если
value
объект является объектом, предварительно выбранный экземпляр должен совпадать с одним из значений.См. Также недавно добавленное пользовательское сравнение https://github.com/angular/angular/issues/13268, доступное с 4.0.0-beta.7
Позаботьтесь, если вы хотите получить доступ
this
внутриcompareFn
.источник
selectedValue
forc
(элемент по умолчанию). Другой объект, даже с теми же свойствами и значениями, не работает, это должен быть один и тот же экземпляр объекта.Это может помочь:
источник
let
вместо#
@ sea-kgВы можете сделать это тоже без необходимости использовать
[(ngModel)]
в вашем<select>
тегеОбъявите переменную в вашем файле TS
toStr = JSON.stringify;
и в вашем шаблоне сделать это
а затем использовать
проанализировать строку обратно в допустимый объект JavaScript
источник
Это сработало для меня:
Шаблон HTML:
Я добавил
(ngModelChange)="selectChange($event)"
в мойselect
.На component.ts:
Вам нужно добавить к
component.ts
этой функции:Примечание: я пробую
[select]="oneOption.id==model.myListOptions.id"
и не работаю.============= Другие способы могут быть: =========
Шаблон HTML:
Я добавил
[compareWith]="compareByOptionId
в мойselect
.На component.ts:
Вам нужно добавить к
component.ts
этой функции:источник
[ngModel]
а затем установить модель вручную в обратном вызове пользовательских изменений, определенном в(ngModelChange)
.На тот случай, если кто-то хочет сделать то же самое с помощью Reactive Forms:
Проверьте рабочий пример здесь
источник
Вы можете выбрать идентификатор с помощью функции
источник
Для меня это работает так, вы можете утешить
event.target.value
.источник
Кроме того, если ничего из указанных решений не работает, проверьте, не импортировали ли вы «FormsModule» из «AppModule», это было для меня ключом.
источник
Создать еще один геттер для выбранного элемента
В тс:
источник
Вы можете получить выбранное значение также с помощью click (), передав выбранное значение через функцию
источник
используйте этот способ также ..
источник
В
app.component.html
:И
app.component.ts
:источник
этот подход всегда будет работать, однако, если у вас есть динамический список, убедитесь, что вы загружаете его перед моделью
источник