我正在使用 Knockout 模型,我希望使用 jQuery UI 范围滑块更新此模型中的值。考虑以下示例:
模型:
var ViewModel = function () {
var self = this;
self.MinTerm = ko.observable();
self.MaxTerm = ko.observable();
}
ko.applyBindings(new ViewModel());
现在,一个 jQuery UI 范围滑块应该更新这两个值。这个(非常丑陋的)解决方案接近了,我的 ViewModel 中的值正在更新,但不知何故这并没有反映在绑定到这些值的控件中,例如:
HTML
<div id="sliderTerms"></div>
<span data-bind="text: MinTerm"></span>
<span data-bind="text: MaxTerm"></span>
脚本:
$("#sliderTerms").slider({
range: true,
min: 6,
max: 120,
values: [6, 120],
step: 1,
slide: function (event, ui) {
ViewModel.MinTerm = ui.values[0];
ViewModel.MaxTerm = ui.values[1];
}
});
现在,如果我可以绑定到像这样的自定义 bindingHandler 那就太好了,它非常适合将滑块绑定到我的 KO 模型中的奇异值:
ko.bindingHandlers.slider = {
init: function (element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().sliderOptions || {};
$(element).slider(options);
ko.utils.registerEventHandler(element, "slidechange", function (event, ui) {
var observable = valueAccessor();
observable(ui.value);
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).slider("destroy");
});
ko.utils.registerEventHandler(element, "slide", function (event, ui) {
var observable = valueAccessor();
observable(ui.value);
});
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (isNaN(value)) value = 0;
$(element).slider("value", value);
}
};
这就是我卡住的地方。例如,是否可以分配一个 valueAccessors 数组,这样我就可以执行以下操作:
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1}"></div>
谢谢!