javascript - 如何在指令中设置 ng-model 的正确范围?

标签 javascript jquery angularjs angularjs-directive uislider

我有一个简单的指令来自动化 slider :

app.directive('slider', function() {
    return {
        restrict: 'AE',
        link: function(scope, element, attrs) {
            element.slider({
                value: scope[attrs.ngModel],
                min: parseInt(attrs.min),
                max: parseInt(attrs.max),
                step: parseFloat(attrs.step),
                slide: function(event, ui) {
                    scope.$apply(function() {
                        scope[attrs.ngModel] = ui.value;
                    });
                }
            });
        }
    };
});

为不同 slider 设置简单的范围:

$scope.sliders = [
    {type : 'red', value : 0},
    {type : 'green', value : 0},
]

HTML:

<div class="sliders" ng-repeat="slider in sliders">
    {{slider.value}}<slider min="1" max="10" step="1" ng-model="slider.value"></slider>
</div>

我的问题是我的 slider 值没有在幻灯片上更新...

演示: http://jsfiddle.net/ZXekc/641/

slider 模型未更新

最佳答案

您可以使用ngModelController更新ng-model

var app = angular.module("app", []);

app.controller("SomeController", function($scope) {
  $scope.sliders = [{
    type: 'red',
    value: 0
  }, {
    type: 'green',
    value: 0
  }, ];
});

app.directive("slider", function() {
  return {
    restrict: 'E',
    require: 'ngModel',
    link: function(scope, elem, attrs, ctrl) {
      $(elem).slider({
        range: false,
        min: parseInt(attrs['min']),
        max: parseInt(attrs['max']),
        step: parseFloat(attrs['step']),
        slide: function(event, ui) {
          scope.$apply(function() {
            ctrl.$setViewValue(ui.value)
          });
        }
      });

      ctrl.$render = function() {
        $(elem).slider("value", ctrl.$viewValue);
      };
    }
  }
});
 slider {
   width: 200px;
   margin: 10px;
   display: block;
 }
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.1/angular.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />

<div ng-app="app">
  <div ng-controller="SomeController">
    Price: {{price}}
    <div class="sliders" ng-repeat="slider in sliders">
      {{slider.type}} = {{slider.value}}
      <slider min="1" max="10" step="1" ng-model="slider.value"></slider>
    </div>
    {{sliders | json}}

    <div>
      <input ng-repeat="slider in sliders" ng-model="slider.value" />
    </div>
  </div>
</div>

关于javascript - 如何在指令中设置 ng-model 的正确范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846604/

相关文章:

javascript - iframe 链接问题

javascript - 如何在 ng-repeat angularJS 内的 $scope 中赋值

javascript - Jasmine beforeeach 与变量等于值的区别

jquery - 使用 jquery mobile 的页面指示器,如 ios/Android

javascript - 如何在加载器加载时停用后台

javascript - AngularJS 范围 $id 的值是如何设置的?似乎没有增量。

javascript - 如何在 javascript 中保存和恢复选择范围?

javascript - 动态生成的下拉选项的 knockout 绑定(bind)

javascript - 使用 mongoose 时,ForEach 循环代码无法在 Promise 中工作

javascript - 无法在数据库中保存 Facebook 登录用户详细信息