【问题标题】:Knockoutjs, jquery mobile sliderKnockoutjs, jquery 移动滑块
【发布时间】:2011-11-16 07:41:46
【问题描述】:

我想知道是否有人有一个带有 knockoutjs 的 JQM 滑块的工作示例。我有两个问题:

1) 将值绑定到可观察对象 - 我可以最初绑定它,即设置滑块的“值”,但这不会在拖动时更新底层可观察对象 - 我认为这与 JQM 放置元素有关表示它的输入?

2) 更改 min、max、value 属性时刷新样式。

这是我所拥有的一个子集,currentItems 根据选择而变化:

workloadViewModel.filterValues = ko.dependentObservable(function () {
var tmp = {};
var itms = this.currentItems();

if (itms.length == 0) return;

tmp.max = itms[0].val;
tmp.min = itms[itms.length - 1].val;
tmp.minRange = this.minRange();

return tmp;
}, workloadViewModel);


ko.bindingHandlers.jqmRefreshSlider = {
update: function (element, valueAccessor) {
    ko.utils.unwrapObservable(valueAccessor()); //just to create a dependency
    try {
        $("input[type=range]").slider("refresh");            
    } catch (error) {
        trace("error refreshing slider");
    }
}
};

<div id="filters" data-bind="template: {name: 'filterTemplate', data: filterValues}, jqmRefreshSlider: filterValues"></div>

<script id='filterTemplate' type='text/html'>        

    <p>min: ${minRange}</p>
    <p>min: ${min}</p>
    <p>max: ${max}</p>
    <div>
        <input type="range" name="slider_min" id="slider_min" value="${minRange}" min="${min}" max="${max}" />
    </div>
</script>

非常感谢您能给我的任何帮助。

J

【问题讨论】:

  • 我想知道,通过“一半的问题”,您是否指的是绑定不是所有滑块选项,如最小值和最大值。如果是这种情况,请告诉我您是否找到了涵盖所有问题的解决方案。

标签: jquery mobile slider knockout.js


【解决方案1】:

这是对 silder 的有效绑定:

ko.bindingHandlers.slider = {
    init: function (element, valueAccessor) {
        var val = valueAccessor()();
        $(element).slider(
                            {
                                value: val,
                                step: 3,
                                slide: function (event, ui) {
                                    valueAccessor()(ui.value);
                                }
                            });
    },
    update: function (element, valueAccessor) {
        $(element).slider("option", "value", valueAccessor()());
    }
};

【讨论】:

    【解决方案2】:

    以上方法都不适合我,因为我的滑块是动态添加的

    <html>
     <head>
      <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.css" />
      <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
      <script src="http://code.jquery.com/mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
      <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script>
     </head>
     <body>
      <span data-bind="text: test"></span>
      <br />
      <br />
      <div class="c-slider" >
      <!-- ko if: is -->
       <input id="test-i" type="range" min="1" max="10" data-bind="value: test, slider: test" />
      <!-- /ko -->
    
      </div>
      <input id="test-t" type="text"  data-bind="value: test" />
      <script type="text/javascript">
    
       function model() {
        var self = this;
        self.test = ko.observable("1");
        self.test.subscribe(function(v) {
        alert('s');
        $("#test-i").val(v).slider('refresh');
     });
    self.is = ko.observable(true);
     }
    
     ko.bindingHandlers.slider = {
      init: function(element, valueAccessor) {
       var value = valueAccessor();
       $(document).on({
        "mouseup touchend": function (elem) {
         value($('#' + element.id).val());
        }
       }, ".c-slider");
      }
     };
    
     var m = new model();
     ko.applyBindings(m);
    </script>
     </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      这几天我一直在用 JQM 滑块咬牙切齿。最后,我能够获得真正的 2 向绑定到滑块值的可观察对象,并让它更新拇指滑块和数字范围输入。这是我想出的:

      ko.bindingHandlers.slider = {
          init: function (element, valueAccessor) {
              // use setTimeout with 0 to run this after Knockout is done
              setTimeout(function () {
                  // $(element) doesn't work as that has been removed from the DOM
                  var curSlider = $('#' + element.id);
                  // helper function that updates the slider and refreshes the thumb location
                  function setSliderValue(newValue) {
                      curSlider.val(newValue).slider('refresh');
                  }
                  // subscribe to the bound observable and update the slider when it changes
                  valueAccessor().subscribe(setSliderValue);
                  // set up the initial value, which of course is NOT stored in curSlider, but the original element :\
                  setSliderValue($(element).val());
                  // subscribe to the slider's change event and update the bound observable
                  curSlider.bind('change', function () {
                      valueAccessor()(curSlider.val());
                  });
              }, 0);
          }
      };
      

      这是它在 HTML 中的使用方式:

      <input type="range" data-bind="value: currentLineWidth, slider: currentLineWidth" name="penSizeSlider" id="penSizeSlider" min="1" max="150" />
      

      我也用这些信息更新了我的博客。可以在此处找到有关集成 Knockout 和 JQuery Mobile 的更多信息。 http://www.programico.com/1/post/2012/12/knockoutjs-jquerymobile-slider.html

      【讨论】:

      • 感谢分享!对于网络新手,我要补充一点,您需要确保您的滑块输入设置了 id。
      【解决方案4】:

      以下内容对我有用。它还处理动态创建的元素。虽然有点hacky。我重用了来自Knockoutjs (version 2.1.0): bind boolean value to select box 的一些代码来自动处理将字符串解析为布尔值,反之亦然:

      ko.bindingHandlers.jqmFlip = {
          init: function(element, valueAccessor, allBindingsAccessor) {
      
              var observable = valueAccessor(),
                  interceptor = ko.computed({
                      read: function() {
                          return observable().toString();
                      },
                      write: function(newValue) {
                          observable(newValue === "true");
                      }
                  });
      
              var result = ko.applyBindingsToNode(element, { value: interceptor });
      
              try {
                  $(element).slider("refresh");
              } catch(x) {
      
                  $(element).next('.ui-slider').remove();
                  $(element).slider();
                  /*console.log('jqmFlip init error ' + x);*/
              }
              return result;
          },
          update: function (element, valueAccessor) {
      
              ko.bindingHandlers.value.update.apply(this, arguments);
              var value = valueAccessor();
              var valueUnwrapped = ko.utils.unwrapObservable(value);
              try {
                  $(element).slider("refresh");
              } catch(x) {
                  debugger;
                  console.log('jqmFlip update error ' + x);
              }
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2012-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多