Angular Directive一次只能在一个元素上运行

时间:2017-04-20 17:44:48

标签: javascript angularjs angular-directive

我有以下角度指令。它使用范围滑块滚动项目的水平div。如果仅应用于一行,则它可以工作。但如果应用于多个......没有任何反应。转换有效,但函数从不运行,也没有给出错误。我能做些什么来使它更具有角度通用性,并且可以处理多个元素?这是repro:CodePen

app.directive('bob', function () {
        return {
            restrict: 'A',
            transclude: true,
            template:
            `<div style="background-color: #333"><input type="range" value="0" id="scroll-rangeb"><div id="photo-containerb" style="display: flex; overflow-x: scroll; flex-direction: row; align-items: center; height: 90%;" ng-transclude></div></div>`,
            link: function (scope, element, attrs) {
                var scroll = document.getElementById("scroll-rangeb");
                scroll.oninput = function () {
                    var panel = document.getElementById("photo-containerb");
                    var total = panel.scrollWidth - panel.offsetWidth;
                    var percentage = total * (this.value / 100);
                    panel.scrollLeft = percentage;
                }
            }
        };
    });

1 个答案:

答案 0 :(得分:1)

#scroll-rangeb是一个独特的元素(在理论上),如果你覆盖每个指令的oninput它显然不起作用,它将只是第一个找到的。无论如何,您不能使用具有相同ID的多个组件。尝试从链接函数上给出的元素参数中找到它,使用类或其他东西。

例如,我可以使用element[0].getElementsByClassName('scroll-rangeb')

解决问题

angular.module('app', [])
  .directive('bob', function() {
    return {
      restrict: 'A',
      transclude: true,
      template: `
          <div style="background-color: #333">
            <input type="range" value="0" class="scroll-rangeb">
            <div
              class="photo-containerb"
              style="display: flex; overflow-x: scroll; flex-direction: row; align-items: center; height: 90%;"
              ng-transclude>
            </div>
          </div>`,
      link: function(scope, $element, attrs) {
        var
          element = $element[0],
          scroll = element.getElementsByClassName("scroll-rangeb")[0],
          panel = element.getElementsByClassName("photo-containerb")[0];

        scroll.oninput = function() {
          var total = panel.scrollWidth - panel.offsetWidth;
          var percentage = total * (this.value / 100);

          panel.scrollLeft = percentage;
        }
      }
    };
  });
img {
  border-radius: 50%;
}

.box {
  display: block;
  width: 50px;
  height: 50px;
  min-width: 50px;
  margin: 10px;
}
<div ng-app="app">
  <div bob>
    <img class="box" ng-repeat="img in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]" src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==">
  </div>
  <div bob>
    <img class="box" ng-repeat="img in [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]" src="data:image/gif;base64,R0lGODlhAQABAIAAAHd3dwAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==">
  </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.js"></script>

相关问题