Angularjs 角度JS:禁用ng单击
场景:我正在使用Angular js指令。我正在努力使元素(即所有锚定标记和按钮,除此之外,还包括作为属性单击的div)禁用。为此,我使用了两个指令。一个用于获取满足上述条件的所有元素,另一个用于覆盖该元素的单击事件的指令 问题:到目前为止,我在获取元素和在这些元素上动态应用指令方面取得了成功。之后,我想禁用单击事件。 我的问题是,我如何使ng click为空,然后一旦我的条件满足,我就必须执行相同的ng click。 注意:我使用$compile编译内容的html。disableElement指令获取所有元素并将ng click属性设置为null。但不知何故,它不起作用 目标:使所有元素的ng单击禁用Angularjs 角度JS:禁用ng单击,angularjs,Angularjs,场景:我正在使用Angular js指令。我正在努力使元素(即所有锚定标记和按钮,除此之外,还包括作为属性单击的div)禁用。为此,我使用了两个指令。一个用于获取满足上述条件的所有元素,另一个用于覆盖该元素的单击事件的指令 问题:到目前为止,我在获取元素和在这些元素上动态应用指令方面取得了成功。之后,我想禁用单击事件。 我的问题是,我如何使ng click为空,然后一旦我的条件满足,我就必须执行相同的ng click。 注意:我使用$compile编译内容的html。disableElement
// Disable Element Directive
app.directive('disableElement', ['$timeout','$compile',($timeout,$compile)=> {
return {
restrict: 'AE',
priority: 1,
link: (scope, element, attr)=> {
$timeout(()=> {
if (condition satisfies get all elements and apply directive dynamically) {
var allDivs = angular.element(element).find("*");
var clickAction;
for (var i = 0; i < allDivs.length; i++) {
var currentElement = allDivs[i];
if (currentElement.attributes.length > 0) {
for (var j = 0; j < currentElement.attributes.length; j++) {
if (currentElement.nodeName == "a" || currentElement.attributes[j].name == "ng-click") {
//Gettting click action
clickAction = currentElement.getAttribute("ng-click");
//making ng-click null
currentElement.setAttribute("ng-click",null);
//applying directive dynamically
currentElement.setAttribute("ng-demo","");
$compile(currentElement)(scope);
}
}
}
}
}
}, 1000);
}
};
}]);
//ng-demo directive which overrides ng-click
app.directive('ngDemo',function() {
return {
restrict: 'A',
link: (scope, element, attr) => {
var clickAction = attr.ngClick;
element.bind('click', (e)=> {
e.preventDefault();
});
}
};
});
//禁用元素指令
app.directive('disableElement',['$timeout','$compile',($timeout,$compile)=>{
返回{
限制:“AE”,
优先事项:1,
链接:(范围、元素、属性)=>{
$timeout(()=>{
if(条件满足获取所有元素并动态应用指令){
var allDivs=angular.element(element.find)(“*”);
var-clickAction;
对于(var i=0;i0){
对于(var j=0;j{
var clickAction=attr.ngClick;
元素绑定('单击',(e)=>{
e、 预防默认值();
});
}
};
});
我遇到了类似的问题,下面是我在JSFIDLE中的解决方案。
基本上,它在编译阶段捕获ngClick事件操作,将该操作存储在其他位置,取消ngClick,然后在链接阶段使用存储的操作设置click事件
在true和false之间更改自定义指令的值将显示结果
HMTL
这不是JavaScript…您试图解决这一问题的方式是行不通的。编译ng click指令后,不能禁用它本身。为什么不检查回调函数本身的条件呢?实现将更加简洁明了。感谢您的回复@专家系统我是角度方面的初学者。所以,请你详细说明你想表达什么,并给我举个例子,让我解决我的问题。我不知道你的应用程序是如何设置的,以便提供更具体的建议,但这样做似乎是合理的:
和someFunction()
:function someFunction(){if(condition.holds){return;}否则{/*做点什么*/}
那么你只需要设置条件。按住到true
和ngClick
s将被有效地禁用。是的,那是真的。但是在这种情况下,我只能禁用那些包含ng click作为属性的元素,但我希望以相同的方式禁用锚定标记。(正如我在指令的条件中为这两个元素检查的一样,元素都有ng click和anchor标记)。那么,禁用anchor标记的方法是什么呢?一旦条件不满足,就应该单击它
<div ng-click="originalAction()" rv-deny-access="false" ng-controller="MyCtrl">
click me
</div>
//Captures ngClick and lets it pass through if directive value is false
var myApp = angular.module('myApp',[]);
myApp.directive('rvDenyAccess', function($parse) {
return {
restrict: 'A',
compile: function(elem, attrs) {
var capturedOriginalAction = attrs.ngClick;
attrs.ngClick = null;
elem.removeAttr('ng-click');
return function(scope, elem, attrs) {
var value = scope.$eval(attrs.rvDenyAccess);
if(value) {
// Can make a new action happen or prevent original action
elem.bind('click', function(e) {
alert('Access denied!');
});
} else {
elem.bind('click', function(e) {
$parse(capturedOriginalAction)(scope)
});
}
};
}
};
});
function MyCtrl($scope) {
$scope.originalAction = function() {
alert('Access granted!');
};
}