【发布时间】:2012-02-21 07:56:28
【问题描述】:
我在同一个项目中同时使用了 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);
然而,这不是很优雅的解决方案,我想更好地解决它。
【问题讨论】: