ng-touchstart and ng-touchend in Angularjs

前端 未结 3 1999
名媛妹妹
名媛妹妹 2021-01-04 01:41

I have an element which fires functions on ng-mousedown and ng-mouseup. However, It doesn\'t work on touch screen, is there any directive like

相关标签:
3条回答
  • 2021-01-04 01:52

    The version we came up with uses $parse(), which is what $eval() uses internally. We specifically wanted to handle mousedown and touchstart events using a single directive, but in the angular way so we can include angular style expressions.

    Like so:

    angular.module("ngStudentselect", []).directive('ngStudentselect', ['$parse', '$timeout', '$rootElement',
    function($parse, $timeout, $rootElement) {
        return function(scope, element, attr) {
            var clickHandler = $parse(attr.ngStudentselect);
    
            element.on('mousedown touchstart', function(event) {
                scope.$apply(function() {
                    clickHandler(scope, {$event: event});
                });
            });
        };
    }]);
    

    This is a stripped down version of angular's ngClick directive.

    0 讨论(0)
  • 2021-01-04 01:56

    There is a module for this: https://docs.angularjs.org/api/ngTouch

    But you can write your own directives for events too:

    <!doctype html>
    <html>
        <head>
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.js"></script>
        </head>
        <body ng-app="plunker">
            <div  ng-controller="MainCtrl">
                <div my-touchstart="touchStart()" my-touchend="touchEnd()">
                    <span data-ng-hide="touched">Touch Me ;)</span>
                    <span data-ng-show="touched">M-m-m</span>
                </div>
            </div>
            <script>
                var app = angular.module('plunker', []);
                app.controller('MainCtrl', ['$scope', function($scope) {
                    $scope.touched = false;
    
                    $scope.touchStart = function() {
                        $scope.touched = true;
                    }
    
                    $scope.touchEnd = function() {
                        $scope.touched = false;
                    }
                }]).directive('myTouchstart', [function() {
                    return function(scope, element, attr) {
    
                        element.on('touchstart', function(event) {
                            scope.$apply(function() { 
                                scope.$eval(attr.myTouchstart); 
                            });
                        });
                    };
                }]).directive('myTouchend', [function() {
                    return function(scope, element, attr) {
    
                        element.on('touchend', function(event) {
                            scope.$apply(function() { 
                                scope.$eval(attr.myTouchend); 
                            });
                        });
                    };
                }]);
            </script>
        </body>
    </html>

    0 讨论(0)
  • 2021-01-04 02:09

    I have made those ealier today since I needed it myself:

    • ngTouch (a collection of the below)
    • ngTouchmove
    • ngTouchstart
    • ngTouchend

    Hope it helps.

    0 讨论(0)
提交回复
热议问题