Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度JS:禁用ng单击_Angularjs - Fatal编程技术网

Angularjs 角度JS:禁用ng单击

Angularjs 角度JS:禁用ng单击,angularjs,Angularjs,场景:我正在使用Angular js指令。我正在努力使元素(即所有锚定标记和按钮,除此之外,还包括作为属性单击的div)禁用。为此,我使用了两个指令。一个用于获取满足上述条件的所有元素,另一个用于覆盖该元素的单击事件的指令 问题:到目前为止,我在获取元素和在这些元素上动态应用指令方面取得了成功。之后,我想禁用单击事件。 我的问题是,我如何使ng click为空,然后一旦我的条件满足,我就必须执行相同的ng click。 注意:我使用$compile编译内容的html。disableElement

场景:我正在使用Angular js指令。我正在努力使元素(即所有锚定标记和按钮,除此之外,还包括作为属性单击的div)禁用。为此,我使用了两个指令。一个用于获取满足上述条件的所有元素,另一个用于覆盖该元素的单击事件的指令

问题:到目前为止,我在获取元素和在这些元素上动态应用指令方面取得了成功。之后,我想禁用单击事件。 我的问题是,我如何使ng click为空,然后一旦我的条件满足,我就必须执行相同的ng click。 注意:我使用$compile编译内容的html。disableElement指令获取所有元素并将ng click属性设置为null。但不知何故,它不起作用

目标:使所有元素的ng单击禁用

// 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!');
   };
}