如何使用 Angular 指令处理单个 HTML 元素上的多个触摸事件

Posted

技术标签:

【中文标题】如何使用 Angular 指令处理单个 HTML 元素上的多个触摸事件【英文标题】:How to handle multiple touch events on a single HTML element using Angular directives 【发布时间】:2013-02-18 02:08:44 【问题描述】:

在我的移动应用程序中,我在主视图中以 html 格式显示内容:

<div class="imageView" na-swipe="next()" na-tap="showControls()"> content here </div>

为了使用 jQuery(或 Hammer.js)处理 swipetouch 事件,我创建了这两个指令:

angular.module("naModule").directive 'naTap', ->
  (scope, element, attrs) ->
    tapping = false
    element.bind 'touchstart', -> tapping = true
    element.bind 'touchmove', -> tapping = false
    element.bind 'touchend', -> scope.$apply(attrs['naTap']) if tapping

angular.module("naModule").directive 'naSwipe', ->
  (scope, element, attrs) ->
    tapping = false
    swiping = false
    element.bind 'touchstart', -> tapping = true
    element.bind 'touchmove', -> swiping = true
    element.bind 'touchend',  -> scope.$apply(attrs['naSwipe']) if (swiping and tapping)

naSwipe 似乎运行良好,即每当执行滑动时都会调用next()...但是,当我点击next()showControls() 时都在触发... 怎么做我在这个 div 上干净地分开触摸和滑动? 谢谢。

【问题讨论】:

【参考方案1】:

我认为您以错误的方式处理您的用例。

考虑使用一个指令,模板是您描述的标记,并在该指令的 link() 函数中定义要捕获的事件。

类似于以下指令:

angular.module('naModule').directive('imageView', function() 
    return 
        restrict: 'E',
        replace: true,
        scope: 
            // As required for your content ...
        ,
        template: '<div class="imageView"> content here </div>',
        controller: function($scope, $attrs) 
            $scope.next = function() 
                // handle function..
            

            $scope.showControls = function() 
                // handle function..
            
        ,
        link: function(scope, element, attrs, controller) 
            element.bind('touchstart', function(e) 
                scope.tapping = true;
                scope.swiping = true;
            

            element.bind('touchmove', function(e) 
                scope.tapping = false;
                scope.swiping = true;
            

            element.bind('touchend', function(e) 
                if(scope.tapping) 
                    scope.next();
                 else 
                    scope.showControls();
                
            
        
    
);

【讨论】:

【参考方案2】:

在某个地方,您需要将 swiping 重置为 false。这可能应该作为 touchstart 回调的一部分来完成。

【讨论】:

以上是关于如何使用 Angular 指令处理单个 HTML 元素上的多个触摸事件的主要内容,如果未能解决你的问题,请参考以下文章

音频标签,如何从 Angular 处理它

如何在 Angular 2 指令中使用 templateUrl

在 Angular 结构指令中使用动态组件会产生额外的 HTML 标记。如何删除或更换它?

Angular 2:我如何将指令应用于净化的 html/innerhtml

如何更改 Angular 指令上的变量?

Ionic App之国际化单个参数的处理