绑定ng-click到css类

时间:2017-06-07 08:07:12

标签: html css angularjs

我们可以将ng-click绑定到CSS类吗?

我有大量的<td>来绑定并检查它们是否被点击然后触发其中的标签点击,以便为触摸设备提供最大可点击区域。

我做过类似下面的事情。

&#13;
&#13;
var myApp = angular.module("myApp", [])
  .controller("myController", ["$scope", "$timeout", function myController($scope, $timeout) {
    $scope.checkRadio = function checkRadio($event) {      
      $timeout(function() {
        angular.element($event.target).find("label").trigger('click');
      }, 100);
    };
  }]);
&#13;
.invisible-radio {
  position: absolute;
  display: inline;
  opacity: 0;
  width: 0;
  margin: 0;
  -webkit-appearance: none;
  overflow: hidden;
}

.custom-radio-label {
  display: inline-block;
  position: relative;
  padding-left: 20px;
  vertical-align: text-top;
  line-height: 20px;
  cursor: pointer;
  border-style: solid;
  border-width: 0;
}

.custom-radio-label::before {
  border-color: #7f7f7f;
  border-radius: 50%;
  background-color: #fff;
  border-width: 2px;
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  width: 18px;
  height: 18px;
  border-style: solid;
  -webkit-box-sizing: content-box;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}

.invisible-radio:checked+.custom-radio-label::after {
  background-color: #337ab7;
  border-radius: 50%;
  top: 5px;
  left: 5px;
  content: "";
  width: 12px;
  height: 12px;
  position: absolute;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<table class="table table-hover text-center center-block" ng-app="myApp" ng-controller="myController">
  <thead>
    <tr>
      <th>Option 1</th>
      <th>Option 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td ng-click="checkRadio($event)">
        <input id="option1" type="radio" class="invisible-radio" name="option" value="0" ng-model="model.Option" required />
        <label class="custom-radio-label" for="option1"></label>
      </td>
      <td ng-click="checkRadio($event)">
        <input id="option2" type="radio" class="invisible-radio" name="option" value="1" ng-model="model.Option" required />
        <label class="custom-radio-label" for="option2"></label>
      </td>
    </tr>
  </tbody>
</table>
&#13;
&#13;
&#13;

但是用<td>属性来装饰100个ng-click s似乎有点过分了。

我在想是否可以将ng-click绑定到我所有<td>共享的公共类。

当然可以使用jQuery进行以下操作。

$(".someclassOnMyTD").click($event) {
   $event.target.find("label").click();
}

但我在这里寻找一种Angular方式。可能的指令。

3 个答案:

答案 0 :(得分:3)

您可以使用angular.element

来完成此操作
  var cells = angular.element(document.querySelectorAll(".someclassOnMyTD"));
  cells.on('click', function(event){
        // write your code here
        // var labels = angular.element(event.currentTarget).find('label');
  })

答案 1 :(得分:1)

实际上这就是<label> for。

<td>
  <label for="option1">
    <input id="option1" type="radio" class="invisible-radio" name="option" value="0" ng-model="model.Option" required />
    <label class="custom-radio-label" for="option1"></label>
  </label>
</td>

您可能需要稍微修改CSS,以便填充其父td

的区域

答案 2 :(得分:0)

我使用ng-view并且需要在几乎所有(超过20个)视图中将事件绑定到很多td

这是一个完整的解决方案,因为它可能会对将来有类似要求的人有用。

$scope.$on('$viewContentLoaded', function () {
    var tables = angular.element(document.querySelectorAll(".myClassOnTable, .myOtherClassOnTable"));
    angular.forEach(tables, function (table) {
        angular.element(table).on("click", function (e) {
            var targetElement = e.target;
            if (targetElement.nodeName == "TD" || targetElement.nodeName == "td") {
                var radio = angular.element(targetElement).find(".invisible-radio");
                if (radio) {
                    angular.element(radio[0]).prop("checked", true);
                    // I needed to set the required attribute manually as I am setting the checked property manually
                    $scope.myForm[radio[0].name].$setValidity("required", true);
                    $scope.$apply();
                }
            }
        });
    });
});

请注意,我已将click事件绑定到table元素,如果点击的目标是td,我正在侦听。这是因为我遇到了以下错误,因为浏览器限制将点击事件同时绑定到元素的hundreads。

  

未捕获RangeError:超出最大调用堆栈大小

所以我将click事件委托给更少数量的元素。