Pressionando um botão e incrementando um número com touchstart no angularjs

Eu tive a necessidade de criar recentemente uma interação daquelas que quando se pressiona o dedo e segura um botão ele vai aumentando ou diminuindo sozinho, e acreditem, eu rodei muito, mas muito na web para conseguir chegar encontrar uma solução.

Como fazer

Vamos criar uma directiva com Angular, essa directiva vai rastrear o nosso button atrás dos eventos touchstart, touchend e touchcancel, mais para frente vou explicar o porque.

Directiva

angular.module('app').directive('increase', function ($interval) {
   return {
      restrict: 'A', // Atributo
      scope: {
        quem: '@', // Se refere a horas ou minutos
        operacao: '@', // Se refere se vamos aumentar ou diminuir
        minutos: '=minutos', // Deve estar definido lá como horas="minutos"
        horas  : '=horas' // Deve estar definido lá como horas="horas"
      },
      link: function($scope, $elm, $attrs) {

		$elm.bind('touchstart', function(evt) {

			// Começa um interval
			promise = $interval(function () {

				// Verifica quem (horas ou minutos)
				if ($scope.quem == "h")
				{
					// Transforma horas para int
					$scope.horas = parseInt($scope.horas);

					// Operação a = aumentar
					if ($scope.operacao == "a"){
						// Se for maior que 23
						if ($scope.horas >= 23){
							$scope.horas = 0;
						}else{

							// Incrementa
							$scope.horas = $scope.horas + 1;
						}
					}

					// Operação d = dimunir
					if ($scope.operacao == "d"){
						// Se for menor que 00
						if ($scope.horas <= 0){
							$scope.horas = 23;
						}else{

							// Decrementa
							$scope.horas = $scope.horas - 1;
						}
					}
				}

				// Verifica quem (horas ou minutos)
				if ($scope.quem == "m")
				{
					// Transforma minutos para int
					$scope.minutos = parseInt($scope.minutos);

					// Operação a = aumentar
					if ($scope.operacao == "a"){
						// Se for maior que 23
						if ($scope.minutos >= 59){
							$scope.minutos = 0;
						}else{

							// Incrementa
							$scope.minutos = $scope.minutos + 1;
						}
					}

					// Operação d = dimunir
					if ($scope.operacao == "d"){
						// Se for menor que 00
						if ($scope.minutos <= 0){
							$scope.minutos = 59;
						}else{

							// Decrementa
							$scope.minutos = $scope.minutos - 1;
						}
					}
				}

	        }, 300);

			$scope.$apply(function() {
				$scope.$eval($attrs.increase)
			});
		});

		// Se faz o touch e move o dedo, então cancela tb
		$elm.bind('touchcancel', function(evt) {
			$interval.cancel(promise);
		});

		// Se tiro o dedo do elemento, então para
		$elm.bind('touchend', function(evt) {
			// Cancela o intervalo
			$interval.cancel(promise);
		});

    }
  };
});

Projeto

É isso ai, espero que tenha reduzido muitas horas de pesquisa, vou deixar um link para um projeto funcionando, vocês baixam e adaptem a sua realidade, abraço!

https://github.com/diogomachado/angular-increase-directive