Если вы хотите привязать идентификатор и текстовое значение к переменной, вам необходимо использовать привязку optionsValue
и привязать к ней весь контекст ($data
);
<select data-bind="value: selectedCar,
optionsCaption: 'Select',
optionsText: 'name',
options: cars,
optionsValue: $data"></select>
Обычномы бы указали идентификатор или что-то еще, чтобы получить начальное значение выбрано.Так что, как и в вашем вопросе, имеет смысл предоставить весь объект {id: 1, name: 'Honda'}
в качестве начального значения для selectedCar
, если мокрое значение установлено optionsValue: $data
, а не $optionsValue: 'id'
.
( ВАЖНО ) Но оказывается, что это не работает, потому что мы создаем новый объект, и поэтому тест на равенство Knockout не пройдёт, когда он сравнит объекты cars
собъект внутри selectedCar
.Правильный способ установить начальное значение: cars[0]
.
Я уверен, что это опечатка, но я все равно уточню: когда вы создаете любую переменную, к которой должен обращатьсяHTML вам нужно привязать его к this
, который будет ссылкой на viewModel.
this.cars = [{id: 1, name: 'Honda'}, {id: 2, name: 'Toyota'}, {id: 3, name: 'Dodge'}];
this.selectedCar = ko.observable();
Давайте проверим все это с помощью скрипки:
var viewModel = function(){
var self = this;
self.cars = [{id: 1, name: 'Honda'}, {id: 2, name: 'Toyota'}, {id: 3, name: 'Dodge'}];
self.selectedCar = ko.observable(self.cars[0]);
};
ko.applyBindings(new viewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<select data-bind="value: selectedCar, optionsCaption: 'Select', optionsText: 'name', optionsValue:$data, options: cars"></select>
<!-- to verify that we are getting the entire object -->
<p data-bind="text: ko.toJSON(selectedCar)"></p>