角度绑定在数据属性中不起作用

时间:2015-04-09 02:19:15

标签: angularjs angularjs-scope

我正在使用一些带有许多html组件的css html模板,并且有很多用于各种事物的数据属性。例如对于滑块,它有类似

的东西
 <div class="slider slider-default">
    <input type="text" data-slider class="slider-span" value="" data-slider-orientation="vertical" data-slider-min="0" data-slider-max="200" data-slider-value="{{ slider }}" data-slider-selection="after" data-slider-tooltip="hide">
</div>

这里我试图绑定值

data-slider-value="{{ slider }}"

但它没有用。可变&#39;滑块&#39;在$ scope中设置为:

   $scope.slider = 80;

当我将其绑定为:

时,相同的值80显示为正确
 <h4>I have {{ slider }} cats</h4>

我也试过

    ng-attr-data-slider-value="{{ slider }}" 

它没有用。

更新

该指令有类似的内容

function slider() {
    return {
        restrict: 'A',
        link: function (scope, element) {
            element.slider();
        }
    }
};

其中element.slider();为每个滑块调用bootstrap-slider.js中的代码(来自here)。

2 个答案:

答案 0 :(得分:4)

我玩了一段时间,并想出了一些选择。请参阅我的Plunkr,了解相关信息。

选项1:滑块更改时无需更新范围值

这将适用于您问题中的HTML。以下是您应该将指令代码更改为。

app.directive('slider', function slider() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      attrs.$observe('sliderValue', function(newVal, oldVal) {
        element.slider('setValue', newVal);
      });
    }
  }
});

选项2:双向绑定到范围属性

如果在拖动滑块手柄时需要更新scope属性,则应将指令更改为以下内容:

app.directive('sliderBind', ['$parse',
  function slider($parse) {
    return {
      restrict: 'A',
      link: function(scope, element, attrs) {
        var val = $parse(attrs.sliderBind);
        scope.$watch(val, function(newVal, oldVal) {
          element.slider('setValue', newVal);
        });

        // when the slider is changed, update the scope
        // property.
        // Note that this will only update it when you stop dragging.
        // If you need it to happen whilst the user is dragging the
        // handle, change it to "slide" instead of "slideStop"
        // (this is not as efficient so I left it up to you)
        element.on('slideStop', function(event) {
          // if expression is assignable
          if (val.assign) {
            val.assign(scope, event.value);
            scope.$digest();
          }
        });
      }
    }
  }
]);

此标记略有变化:

<div class="slider slider-default">
  <input type="text" data-slider-bind="slider2" class="slider-span" value="" data-slider-orientation="vertical" data-slider-min="0" data-slider-max="200" data-slider-selection="after" data-slider-tooltip="hide" />
</div>

请注意使用data-slider-bind属性指定要绑定的scope属性,以及缺少data-slider-value属性。

希望这两个选项中的一个是你所追求的。

答案 1 :(得分:0)

我使用 .attr 并且它对我有用。试试这个:

attr.data-slider-value="{{slider}}"