2014-10-02 22 views

risposta

13

C'è un modulo per questo: https://docs.angularjs.org/api/ngTouch

Ma è possibile scrivere i propri direttive per gli eventi troppo:

<!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

Ho installato questo modulo ieri e ho scritto questo post dopo. Proverò con queste direttive. – ciembor

+2

La libreria ngTouch di Angular non supporta l'associazione a singoli touch e eventi di rilascio: http://stackoverflow.com/questions/19985097/can-angulars-ngtouch-library-be-used-to-detect-a-long-click-touch -hold-release – Egg

7

ho fatto quelle ealier oggi oggi e ne avevo bisogno me stesso:

Speranza che aiuta.

+0

Vorrei usare ngTouchstart, ma sfortunatamente utilizza eval(), che si interromperà in un'app Chrome. –

+0

Appena aggiornato per usare '$ scope. $ Apply'. –

+1

grazie! può decidere di spostarsi a sinistra o a destra rispetto alla direttiva? – Martian2049

1

La versione che abbiamo utilizzato utilizza $ parse(), che è ciò che $ eval() utilizza internamente. In particolare, volevamo gestire gli eventi mouse e touchstart utilizzando una singola direttiva, ma in modo angolare in modo da includere espressioni di stile angolare.

Come così:

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}); 
      }); 
     }); 
    }; 
}]); 

Questa è una versione ridotta della direttiva ngClick di angolare.