淘汰模式&x2B;jqueryui范围滑块
我使用的是淘汰模型,我希望使用jQueryUI范围滑块更新该模型中的值。考虑下面的例子: 型号:淘汰模式&x2B;jqueryui范围滑块,jquery,jquery-ui,knockout.js,Jquery,Jquery Ui,Knockout.js,我使用的是淘汰模型,我希望使用jQueryUI范围滑块更新该模型中的值。考虑下面的例子: 型号: var ViewModel = function () { var self = this; self.MinTerm = ko.observable(); self.MaxTerm = ko.observable(); } ko.applyBindings(new ViewModel()); 现在,jQueryUI范围滑块应该更新这两个值。这个(非常难看的)解决方案很接
var ViewModel = function () {
var self = this;
self.MinTerm = ko.observable();
self.MaxTerm = ko.observable();
}
ko.applyBindings(new ViewModel());
现在,jQueryUI范围滑块应该更新这两个值。这个(非常难看的)解决方案很接近,我的ViewModel中的值正在更新,但不知何故,这并没有反映在绑定到这些值的控件中,例如:
HTML
现在,如果我可以绑定到这样一个自定义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);
}
};
这就是我被卡住的地方。例如,是否可以分配ValueAccessor数组,以便执行以下操作:
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1}"></div>
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1, values: [6,120]}"></div>
update: function (element, valueAccessor, allBindingsAccessor) {
console.log("update fired");
var value = ko.utils.unwrapObservable(valueAccessor());
if(value instanceof Array)
{
var value1= ko.utils.unwrapObservable(value[0]);
var value2= ko.utils.unwrapObservable(value[1]);
if(value1)
{
value = [value1, value2];
}
else value = 0;
}
else if (isNaN(value)) value = 0;
$(element).slider(value.slice ? "values" : "value", value);
$(element).slider("option", allBindingsAccessor().sliderOptions);
}
谢谢 我在你的基础上写了我自己的,这是一个快速的模型,所以可能会有bug
谢谢!您的代码启发我编写了以下bindingHandler:
ko.bindingHandlers.rangeSlider = {
init: function (element, valueAccessor, allBindingsAccessor) {
var options = allBindingsAccessor().sliderOptions || {};
var observable = valueAccessor();
ko.utils.registerEventHandler(element, "slidechange", function (event, ui) {
observable[0](ui.values[0]);
observable[1](ui.values[1]);
});
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
$(element).slider("destroy");
});
ko.utils.registerEventHandler(element, "slide", function (event, ui) {
observable[0](ui.values[0]);
observable[1](ui.values[1]);
});
$(element).slider(options);
},
update: function (element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if(value instanceof Array)
{
var value1= ko.utils.unwrapObservable(value[0]);
var value2= ko.utils.unwrapObservable(value[1]);
if(value1)
{
value = [value1, value2];
}
else value = 0;
}
else if (isNaN(value)) value = 0;
$(element).slider(value.slice ? "values" : "value", value);
}
};
现在我可以像这样将RangeSloider绑定到我的淘汰模型:
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1}"></div>
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1, values: [6,120]}"></div>
update: function (element, valueAccessor, allBindingsAccessor) {
console.log("update fired");
var value = ko.utils.unwrapObservable(valueAccessor());
if(value instanceof Array)
{
var value1= ko.utils.unwrapObservable(value[0]);
var value2= ko.utils.unwrapObservable(value[1]);
if(value1)
{
value = [value1, value2];
}
else value = 0;
}
else if (isNaN(value)) value = 0;
$(element).slider(value.slice ? "values" : "value", value);
$(element).slider("option", allBindingsAccessor().sliderOptions);
}
这有点难闻,因为我假设值[I]应该绑定到valueAccessor[I],但这对我来说已经足够了。对于@Nico Beemster在自己的代码中发现的bug,我们需要“更新”更新:部分,如下所示:
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1}"></div>
<div id="sliderTerms" data-bind="rangeSlider: [MinTerm, MaxTerm], sliderOptions: {min: 6, max: 120, range: true, step: 1, values: [6,120]}"></div>
update: function (element, valueAccessor, allBindingsAccessor) {
console.log("update fired");
var value = ko.utils.unwrapObservable(valueAccessor());
if(value instanceof Array)
{
var value1= ko.utils.unwrapObservable(value[0]);
var value2= ko.utils.unwrapObservable(value[1]);
if(value1)
{
value = [value1, value2];
}
else value = 0;
}
else if (isNaN(value)) value = 0;
$(element).slider(value.slice ? "values" : "value", value);
$(element).slider("option", allBindingsAccessor().sliderOptions);
}
是最新的小提琴。如果你想更新最大和最小范围元素,如果它们是可观察的元素。我更新了我的,因为另一个问题发现了一个错误,如果我更改了绑定到范围滑块的模型中的值,滑块值不会被更新。将发布一个修复(如果我找到一个…)尚未解决,这里有一个小提琴演示“挑战”: