仅在滑块停止后更新滑块

update slider only after the slider stops

本文关键字:更新      更新时间:2023-09-26

>我有一个使用 jquery-ui sliderknockout.js滑块。

<input id="ex2" data-slider-id="ex2Slider" type="text" data-bind="sliderValue: {value: borrowOrInvestAmount, min:0, max: 5000, step: 1, formatter:formatter2}, event: { change: $root.getInvestmentDetailsForBorrower }, valueUpdate:['afterkeydown','propertychange','input']" style="display: none;">

所以我尝试使用value-update但没有奏效。现在,当我单击滑块点而不拖动它时,它正常工作并调用$root.getInvestment,但我希望在滑块停止拖动后立即调用它。

现在,当我拖动滑块时,它会停止在所有点上,直到到达目标。

你只需要替换:

ko.utils.registerEventHandler(element, "slidestop",..)

ko.utils.registerEventHandler(element, "slidestop",...)

ko.utils.registerEventHandler(element, "slide", function (event, ui) {...

ko.utils.registerEventHandler(element, "stop", function (event, ui) {...

此更改将更改发生的事件从 slide 更改为 stop

工作示例:

ko.bindingHandlers.slider = {
  init: function (element, valueAccessor, allBindingsAccessor) {
    var options = allBindingsAccessor().sliderOptions || {};
    $(element).slider(options);
    ko.utils.registerEventHandler(element, "slidestop", function (event, ui) {
        var observable = valueAccessor();
        observable(ui.value);
    });
    ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
        $(element).slider("destroy");
    });
    ko.utils.registerEventHandler(element, "stop", 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);
  }
};
var ViewModel = function() {
    var self = this;
    
    self.savings = ko.observable(10);
    self.spent = ko.observable(5);
    self.net = ko.computed(function() {
        return self.savings() - self.spent();
    });
}
ko.applyBindings(new ViewModel());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script>
<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" />
<script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script>
<h2>Slider Demo</h2>
Savings: <input data-bind="value: savings, valueUpdate: 'afterkeydown'" />
<div style="margin: 10px" data-bind="slider: savings, sliderOptions: {min: 0, max: 100, range: 'min', step: 1}"></div>
Spent: <input data-bind="value: spent, valueUpdate: 'afterkeydown'" />
<div style="margin: 10px" data-bind="slider: spent, sliderOptions: {min: 0, max: 100, range: 'min', step: 1}"></div>
Net: <span data-bind="text: net"></span>

我发现了代码中的错误,我只是在 valueUpdate 中写了太多,只是写这个

valueUpdate: 'afterkeydown'

取而代之的是这个

valueUpdate:['afterkeydown','propertychange','input']

完美工作!