当前位置: 首页 > 面试题库 >

如何有条件地禁用ngTouch并回退到ng-click

容寒
2023-03-14
问题内容

如何使用 ngTouch, 但对某些元素 有选择地禁用
它?也就是说,对于某些元素,我想使用原始ngClick指令,而不是ngTouch提供的指令。像这样:

 <button ng-click-original="myClickFn()">click me</button>

问题答案:

问题是,一旦您将ngTouch模块包含在依赖项中,其版本ngClick
ngTouch.directive('ngClick'将覆盖角核的原始ngClickDirective。因此,所有点击都将由ngTouch的版本处理,ng- click因此您需要装饰模块中的ngCLick才能处理您的情况。我可以在这里想到几种方法:

方法1-创建自己的指令

由于它是一个自定义指令,因此如何创建一个ng-click-orig可能不带有前缀的方法ng

.directive('ngClickOrig', ['$parse', function($parse) {
      return {
        compile: function($element, attr) {
          var fn = $parse(attr["ngClickOrig"]);
          return function handler(scope, element) {
            element.on('click', function(event) {
              scope.$apply(function() {
                fn(scope, {$event:event});
              });
            });
          };
        }
     };
 }]);

演示版

方法2:-使用ng-Click指令的装饰器

另一种方法是在ngClickDirective上创建装饰器,查找特定的属性notouch并执行常规点击,或使用ngTouch提供的原始属性。

.config(function($provide){
   //Create a decoration for ngClickDirective   
   $provide.decorator('ngClickDirective', ['$delegate','$parse', function($delegate, $parse) {
        //Get the original compile function by ngTouch
        var origValue = $delegate[0].compile();
        //Get set the compiler
        $delegate[0].compile = compiler;
        //return augmented ngClick
        return $delegate;

       /*Compiler Implementation*/
       function compiler(elm, attr){
          //Look for "notouch" attribute, if present return regular click event, 
          //no touch simulation
          if(angular.isDefined(attr.notouch)){
            var fn = $parse(attr["ngClick"]);
            return function handler(scope, element) {
              element.on('click', function(event) {
                scope.$apply(function() {
                  fn(scope, {$event:event});
                });
              });
            }
          }
          //return original ngCLick implementation by ngTouch
          return origValue;
         }
   }]);
});

就像注释装饰器在第一次使用该指令之前不会运行,并且只会运行一次。

用法示例:-

   <button ng-click="myClickFn()" notouch>click me</button> <-- see notouch attribute -->
   <button ng-click="myClickFnTouch()">click me</button>

演示装饰器



 类似资料:
  • 我在Spring中使用注释定义了使用cron样式模式的调度作业。 cron模式存储在配置属性文件中。实际上有两个属性文件:一个默认配置文件,一个与环境相关的配置文件(例如dev、test、prod customer1、prod customer2等)覆盖了一些默认值。 我在spring上下文中配置了一个属性占位符bean,它允许我使用样式的占位符从属性文件中导入值。 作业bean如下所示: 我的上

  • 问题内容: 我有HTML结构: 如何禁用外,如果我做 问题答案: 在角度对象上使用该方法: 或将对象作为方法的参数传递,然后调用方法: 在:

  • 问题内容: 我正在使用注释在Spring中使用cron样式模式定义计划的作业。 Cron模式存储在配置属性文件中。实际上,有两个属性文件:一个默认配置,一个与环境相关的配置文件配置(例如dev,test,prod客户1,prod客户2等),并覆盖某些默认值。 我在春天的上下文中配置了一个属性占位符bean,这使我可以使用样式占位符从属性文件中导入值。 工作豆看起来像这样: 我的上下文XML的相关部

  • 问题内容: 我有一个ng-repeat打印列表项。我想编写一个自定义过滤器,以便仅在条件为true时才打印列表项。 我似乎结构有误,因为似乎变量没有传递给过滤器。 index.php app.js 问题答案: 过滤器无法处理数组中的单个项目,它们会将整个数组转换为另一个数组。 看到这个plnkr *始终检查函数的参数。值并不总是很明显。 请参阅过滤器指南

  • 问题内容: 我在ng-repeat中有以下代码: 如何使按钮处于禁用状态? 或者有没有一种方法可以用Javascript来完成,因此如下所示: 问题答案: 除指令外,在任何地方都不能使用DOM(包括属性检查)进行操作。您可以在范围内添加一些值,该值指示是否应禁用链接。 但是另一个问题是ngDisabled除了表单控件之外不能在其他任何东西上使用,因此您不能将其与一起使用,但可以将其与一起使用并将其

  • 问题内容: 我有一个组件,有时有时需要呈现为和,有时需要呈现为。在我读来确定这一点,是。 如果存在,则需要将组件包装在中。否则,它将仅呈现为。 可能? 这是我现在正在做的,但是感觉可以简化: 更新: 这是最终的锁定。感谢您的提示,@ Sulthan! 问题答案: 只需使用一个变量。 或者,您可以使用辅助函数来呈现内容。JSX和其他代码一样。如果要减少重复,请使用函数和变量。