Я создаю простое приложение с Knockout.js в качестве доказательства концепции.Поскольку я очень новичок в Knockout, код в этом вопросе может быть далек от совершенства и демонстрировать плохие практики, поэтому не стесняйтесь, дайте мне знать, если это так!
Я использую options
привязка для создания содержимого элемента select
:
<select data-bind="options: titles, optionsText: 'display', optionsValue: 'value'">
</select>
Модель представления выглядит следующим образом:
var ViewModel = function() {
this.titles = ko.observableArray([]);
};
На DOM ready я нажимаю некоторыезначения в этот наблюдаемый массив (каждое значение является литералом объекта, представляющим «заголовок», например, «Mr», «Mrs» и т. д.):
var data = [
{ value: "Mr", display: "Default Value" },
{ value: "Miss", display: "Miss" },
{ value: "Mr", display: "Mr" },
{ value: "Ms", display: "Ms" }
];
ko.applyBindings(view);
for(var i = 0; i < data.length; i++) {
view.titles.push(data[i]); //Push titles into observable array
}
Не спрашивайте, почему существуют два объекта сЗначение «Мистер» - вот как поступают данные, с которыми мне приходится иметь дело.Я не могу это изменить.Тем не менее, это то, что вызывает проблему.Я ожидаю, что первый объект будет представлять выбранную опцию, но это не так.Третий объект представляет элемент option
, который фактически заканчивается выбором по умолчанию.
Я полагаю, это связано с тем фактом, что наблюдаемый массив вызывает добавление элементов option
к элементу DOM путемодин, как цикл повторяется.Knockout пытается сохранить выбранный параметр, проверив его значение.После первой итерации выбранный option
имеет значение «Mr».После третьей итерации есть еще option
со значением "Mr", поэтому Knockout считает, что это был ранее выбранный параметр, и выбирает его.
Вот ссылка на скрипку , демонстрирующуюпроблема.Параметр «Значение по умолчанию» должен быть выбран, но это не так.Если вы нажмете кнопку, чтобы снова добавить другой параметр с тем же значением, который станет выбранным, но, согласно документации, это не должно быть.
Мой вопрос: как можно предотвратить такое поведение?