【问题标题】:Make slider steps specific values使滑块步骤特定值
【发布时间】:2016-05-20 16:47:25
【问题描述】:

我有一个滑块,它的最小1、最大24 和1 的步长。我是否可以将步骤设置为1, 2, 3, 4, 12, 18, 24?这就是当滑块向左或向右改变时将显示的所有值。

<input id="ex1" data-slider-id="ex1Slider" type="text" data-bind="sliderValue: {value: loanperiod, min:0, max: 24, step: 1, formatter:formatter1}, event: { change: $root.getInvestmentDetailsForBorrower }, valueUpdate: 'afterkeydown' " style="display: none;">

Slider 具有 knockout.js 绑定。

如果需要,我将在此处添加滑块​​绑定

// Custom binding for slider value
    (function ($) {

        ko.bindingHandlers.sliderValue = {
            init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var params = valueAccessor();

        // Check whether the value observable is either placed directly or in the paramaters object.
        if (!(ko.isObservable(params) || params['value']))
            throw "You need to define an observable value for the sliderValue. Either pass the observable directly or as the 'value' field in the parameters.";

        // Identify the value and initialize the slider
        var valueObservable;
        if (ko.isObservable(params)) {
            valueObservable = params;
            $(element).slider({value: ko.unwrap(params)});
        }
        else {
            valueObservable = params['value'];
            if (!Array.isArray(valueObservable)) {
                // Replace the 'value' field in the options object with the actual value
                params['value'] = ko.unwrap(valueObservable);
                $(element).slider(params);
            }
            else {
                valueObservable = [params['value'][0], params['value'][1]];
                params['value'][0] = ko.unwrap(valueObservable[0]);
                params['value'][1] = ko.unwrap(valueObservable[1]);
                $(element).slider(params);
            }
        }

        // Make sure we update the observable when changing the slider value
        $(element).on('slide', function (ev) {
            if (!Array.isArray(valueObservable)) {
                valueObservable(ev.value);
            }
            else {
                valueObservable[0](ev.value[0]);
                valueObservable[1](ev.value[1]);
            }
        }).on('change', function (ev) {
            if (!Array.isArray(valueObservable)) {
                valueObservable(ev.value.newValue)
            }
            else {
                valueObservable[0](ev.value.newValue[0]);
                valueObservable[1](ev.value.newValue[1]);
            }
        });

        // Clean up
        ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
            $(element).slider('destroy');
            $(element).off('slide');
        });

            },
            update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
        var modelValue = valueAccessor();
        var valueObservable;
        if (ko.isObservable(modelValue))
            valueObservable = modelValue;
        else
            valueObservable = modelValue['value'];

        if (!Array.isArray(valueObservable)) {
            $(element).slider('setValue', parseFloat(valueObservable()));
        }
        else {
            $(element).slider('setValue', [parseFloat(valueObservable[0]()),parseFloat(valueObservable[1]())]);
        }
            }
        };

    })(jQuery);

    // Custom binding for slider
    (function ($) {

        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);

            }
        };

    })(jQuery);

【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    我认为您只想拥有一个函数,该函数采用原始滑块值并将其转换为您的自定义值。然后在需要该值的任何地方使用该结果。

    vm = {
      sliderValues: [1, 2, 3, 4, 12, 18, 24],
      rawSliderValue: ko.observable(1),
      sliderValue: ko.pureComputed(function() {
        return vm.sliderValues[vm.rawSliderValue() - 1];
      })
    };
    
    ko.applyBindings(vm);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    <input type="range" min="1" data-bind="attr {max: sliderValues.length}, value: rawSliderValue, valueUpdate: 'input'" />
    <div data-bind="text: sliderValue"></div>

    【讨论】:

    • 嘿,谢谢你给我看,但是我可以把 max 属性放在我的滑块上吗?那么它会给混乱带来更少的麻烦
    • 我可以像 attr {max : 1,2,3,4,12,18,24} 一样使用它吗??
    • 不,max 只是一个数字,表示滑块可以产生的最大值。您可以将最大值设为 24,但它会允许从 1 到 24 的所有值。然后您可以订阅一个函数来将任何无效值更改为最接近的有效值,但这比这更麻烦和丑陋。
    • 我明白你的意思,但你能告诉我如何编写该函数而不将其绑定到 VM 吗?那么这对我来说会更容易,因为我对很多页面使用一个 js 文件,并且它们在 html 中使用 ID 进行应用绑定
    • 您可以将转换放在绑定处理程序中,因为这似乎是您管理值的地方。您需要处理原始值与自定义值之间的转换,以便您可以处理滑块和 observable 中的更改。
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2021-08-25
    • 2017-04-28
    • 2022-11-17
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多