Dynamically update ion.rangeSlider ngModel in AngularJS directive

后端 未结 2 1455
栀梦
栀梦 2020-12-19 23:55

I\'m trying to update the value of an Ion.RangeSlider when its bound ng-model scope variable changes. The model updates when the Ion.RangeSl

相关标签:
2条回答
  • 2020-12-20 00:03

    Extra demo, how binding ion.rangeSlider to input works:

    http://jsfiddle.net/IonDen/r5aox84v/

    var $range = $(".js-range-slider"),
        $inputFrom = $(".js-input-from"),
        $inputTo = $(".js-input-to"),
        instance,
        min = 0,
        max = 1000,
        from = 0,
        to = 0;
    
    $range.ionRangeSlider({
        type: "double",
        min: min,
        max: max,
        from: 200,
        to: 800,
        onStart: updateInputs,
        onChange: updateInputs
    });
    instance = $range.data("ionRangeSlider");
    
    function updateInputs (data) {
        from = data.from;
        to = data.to;
    
        $inputFrom.prop("value", from);
        $inputTo.prop("value", to); 
    }
    
    $inputFrom.on("input", function () {
        var val = $(this).prop("value");
    
        // validate
        if (val < min) {
            val = min;
        } else if (val > to) {
            val = to;
        }
    
        instance.update({
            from: val
        });
    });
    
    $inputTo.on("input", function () {
        var val = $(this).prop("value");
    
        // validate
        if (val < from) {
            val = from;
        } else if (val > max) {
            val = max;
        }
    
        instance.update({
            to: val
        });
    });
    
    0 讨论(0)
  • 2020-12-20 00:16

    Just use slider.update() inside your directive and you will be fine:

    var app = angular.module('myApp', []);
    
    app.controller('MainCtrl', function ($scope, $rootScope, $timeout) {
    
        $scope.someNumber = 15;
        $scope.apply = false;
    
    }).directive('ionRangeSlider', function ionRangeSlider() {
       return {
          restrict: 'A',
          scope: {
             rangeOptions: '=',
             model: '=ngModel',
             apply: '=apply'
          },
          link: function (scope, elem, attrs) {
             elem.ionRangeSlider(scope.rangeOptions);
             scope.$watch('apply',function () {
              if (scope.apply) {
                scope.apply = false;
                var slider = elem.data("ionRangeSlider");            
                slider.update({
                   from: scope.model
                });
              }
             });
          }
       }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.10/angular.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/1.1.2/ui-bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.6/js/ion.rangeSlider.js"></script>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.6/css/ion.rangeSlider.min.css" />
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ion-rangeslider/2.1.6/css/ion.rangeSlider.skinFlat.min.css" />
    
    <div ng-app="myApp" ng-controller="MainCtrl" class="wrapper">
      <h3>Text input updates slider and vice-versa.</h3>
      <input ion-range-slider ng-model="someNumber" apply="apply" range-options="{min: -100, max: 100, step: .001}">
      <br/>
      <input type="text" ng-model="someNumber" class="form-control" ng-change="apply = true">
    </div>

    0 讨论(0)
提交回复
热议问题