Я использую и Knockout (версия 2.0), и jQuery Mobile (версия 1.0.1) в одном проекте. Проблема с привязкой данных для выбора списков. jQuery Mobile представляет списки выбора таким образом, что кажущееся выбранное значение и фактический список являются отдельными элементами. Это исправлено выполнением
$(element).selectmenu('refresh', true);
после изменения списка или выбранного значения. Исходя из моего опыта, это опасная ситуация, так как разработчики часто забывают обновить список выбора.
Чтобы облегчить это, я написал свой собственный обработчик привязки Knockout. Значения привязаны к списку выбора со следующим кодом:
<select name="selection" data-bind="jqmOptions: values, optionsValue: 'id', optionsText: 'name', value: selectedValue">
</select>
Реализация jqmOptions:
ko.bindingHandlers.jqmOptions = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.init !== 'undefined') {
ko.bindingHandlers.options.init(element, valueAccessor, allBindingsAccessor, viewModel);
}
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
if (typeof ko.bindingHandlers.options.update !== 'undefined') {
ko.bindingHandlers.options.update(element, valueAccessor, allBindingsAccessor, viewModel);
}
var instance = $.data(element, 'selectmenu');
if (instance) {
$(element).selectmenu('refresh', true);
}
}
};
При этом используется собственная привязка options
, но в дополнение к этому она автоматически обновляет списки выбора после изменения значений списка. Однако с этим возникает проблема, когда я меняю выбранное значение. Если я сначала устанавливаю значения списка, мои jqmOptions обновляют список выбора, но в этот момент выбранное значение еще не установлено. В итоге я получаю список выбора, который имеет все правильные значения и внутренне выбран правильный вариант, но jQuery Mobile по-прежнему отображает значение по умолчанию, как выбрано.
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
Knockout не позволяет мне сначала установить выбранное значение, а затем установить значения списка, потому что в этом случае нет допустимых значений, когда я устанавливаю выбранное значение. Таким образом, выбранное значение всегда не определено.
Есть ли способ написать пользовательскую привязку Knockout, которая бы обновляла элемент списка выбора в обоих случаях: при изменении значения списка и при изменении выбранного значения?
В настоящее время я решаю эту ситуацию с помощью следующего кода:
this.values(someArrayOfValues);
this.selectedValue(oneOfTheArrayValues);
this.values(someArrayOfValues);
Однако это не очень элегантное решение, и я хотел бы решить его лучше.