我们可以将ng-click绑定到CSS类吗?
我有大量的<td>
来绑定并检查它们是否被点击然后触发其中的标签点击,以便为触摸设备提供最大可点击区域。
我做过类似下面的事情。
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;
但是用<td>
属性来装饰100个ng-click
s似乎有点过分了。
我在想是否可以将ng-click
绑定到我所有<td>
共享的公共类。
当然可以使用jQuery
进行以下操作。
$(".someclassOnMyTD").click($event) {
$event.target.find("label").click();
}
但我在这里寻找一种Angular方式。可能的指令。
答案 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事件委托给更少数量的元素。