私は Knockout モデルを使用しており、jQuery UI の範囲スライダーを使用してこのモデルの値を更新したいと考えています。次の例を検討してください。
モデル:
var ViewModel = function () {
var self = this;
self.MinTerm = ko.observable();
self.MaxTerm = ko.observable();
}
ko.applyBindings(new ViewModel());
これで、jQuery UI の範囲スライダーがこれら 2 つの値を更新するはずです。この (非常に醜い) ソリューションに近づき、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>
ありがとう!