La mia app AngularJS deve essere in grado di rilevare sia l'inizio che l'arresto di un evento tattile (senza strisciare). Ad esempio, ho bisogno di eseguire un po 'di logica all'avvio del tocco (l'utente preme il dito e tiene premuto), quindi esegue una logica diversa quando lo stesso tocco termina (l'utente rimuove il dito). Sto cercando di implementare ngTouch per questa attività, ma la documentazione per la direttiva ngTouch.ngClick menziona solo l'attivazione dell'evento alla spina. Il servizio ngTouch. $ Swipe è in grado di rilevare l'inizio e l'interruzione dell'evento tattile, ma solo se l'utente lo ha effettivamente fatto scorrere (spostato il dito orizzontalmente o verticalmente) mentre si toccava. Qualcuno ha qualche idea? Dovrò semplicemente scrivere la mia direttiva?È possibile utilizzare la libreria ngTouch di angular per rilevare un evento di clic lungo (tocco/attesa/rilascio)?
risposta
Aggiornamento 11/25/14:
La biblioteca angolare-martello a spaziatura fissa è superata in questo momento, quindi la squadra Hammer.js recommend utilizzare il ryan mullins version, che è costruito nel corso del martello v2.0 +.
ho scavato nel ngTouch e da quello che posso dire che non ha il supporto per qualcosa di diverso rubinetto e colpo (a partire dal momento in cui scriviamo, la versione 1.2.0). Ho optato per una libreria multi-touch più matura (hammer.js) e un modulo angolare ben collaudato e mantenuto (martello angolare) che espone tutte le funzionalità multi-touch di hammer.js come direttive attributo.
La biblioteca angolare martello spaziatura fissa è superata in questo momento, quindi la squadra Hammer.js recommend utilizzare il ryan mullins version, che è costruito nel corso del martello v2.0 +.
Questa è una buona notizia, grazie! Sono andato avanti e l'ho aggiunto per rispondere per assicurarmi che le persone non lo perdessero. – Egg
Si tratta di una buona implementazione: esempio
// pressableElement: pressable-element
.directive('pressableElement', function ($timeout) {
return {
restrict: 'A',
link: function ($scope, $elm, $attrs) {
$elm.bind('mousedown', function (evt) {
$scope.longPress = true;
$scope.click = true;
// onLongPress: on-long-press
$timeout(function() {
$scope.click = false;
if ($scope.longPress && $attrs.onLongPress) {
$scope.$apply(function() {
$scope.$eval($attrs.onLongPress, { $event: evt });
});
}
}, $attrs.timeOut || 600); // timeOut: time-out
// onTouch: on-touch
if ($attrs.onTouch) {
$scope.$apply(function() {
$scope.$eval($attrs.onTouch, { $event: evt });
});
}
});
$elm.bind('mouseup', function (evt) {
$scope.longPress = false;
// onTouchEnd: on-touch-end
if ($attrs.onTouchEnd) {
$scope.$apply(function() {
$scope.$eval($attrs.onTouchEnd, { $event: evt });
});
}
// onClick: on-click
if ($scope.click && $attrs.onClick) {
$scope.$apply(function() {
$scope.$eval($attrs.onClick, { $event: evt });
});
}
});
}
};
})
Usage:
<div pressable-element
ng-repeat="item in list"
on-long-press="itemOnLongPress(item.id)"
on-touch="itemOnTouch(item.id)"
on-touch-end="itemOnTouchEnd(item.id)"
on-click="itemOnClick(item.id)"
time-out="600"
>{{item}}</div>
var app = angular.module('pressableTest', [])
.controller('MyCtrl', function($scope) {
$scope.result = '-';
$scope.list = [
{ id: 1 },
{ id: 2 },
{ id: 3 },
{ id: 4 },
{ id: 5 },
{ id: 6 },
{ id: 7 }
];
$scope.itemOnLongPress = function (id) { $scope.result = 'itemOnLongPress: ' + id; };
$scope.itemOnTouch = function (id) { $scope.result = 'itemOnTouch: ' + id; };
$scope.itemOnTouchEnd = function (id) { $scope.result = 'itemOnTouchEnd: ' + id; };
$scope.itemOnClick = function (id) { $scope.result = 'itemOnClick: ' + id; };
})
.directive('pressableElement', function ($timeout) {
return {
restrict: 'A',
link: function ($scope, $elm, $attrs) {
$elm.bind('mousedown', function (evt) {
$scope.longPress = true;
$scope.click = true;
$scope._pressed = null;
// onLongPress: on-long-press
$scope._pressed = $timeout(function() {
$scope.click = false;
if ($scope.longPress && $attrs.onLongPress) {
$scope.$apply(function() {
$scope.$eval($attrs.onLongPress, { $event: evt });
});
}
}, $attrs.timeOut || 600); // timeOut: time-out
// onTouch: on-touch
if ($attrs.onTouch) {
$scope.$apply(function() {
$scope.$eval($attrs.onTouch, { $event: evt });
});
}
});
$elm.bind('mouseup', function (evt) {
$scope.longPress = false;
$timeout.cancel($scope._pressed);
// onTouchEnd: on-touch-end
if ($attrs.onTouchEnd) {
$scope.$apply(function() {
$scope.$eval($attrs.onTouchEnd, { $event: evt });
});
}
// onClick: on-click
if ($scope.click && $attrs.onClick) {
$scope.$apply(function() {
$scope.$eval($attrs.onClick, { $event: evt });
});
}
});
}
};
})
li {
cursor: pointer;
margin: 0 0 5px 0;
background: #FFAAAA;
}
<div ng-app="pressableTest">
<div ng-controller="MyCtrl">
<ul>
<li ng-repeat="item in list"
pressable-element
on-long-press="itemOnLongPress(item.id)"
on-touch="itemOnTouch(item.id)"
on-touch-end="itemOnTouchEnd(item.id)"
on-click="itemOnClick(item.id)"
time-out="600"
>{{item.id}}</li>
</ul>
<h3>{{result}}</h3>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
Sulla base: https://gist.github.com/BobNisco/9885852
Bello! Deve essere up-votato. –
- 1. È possibile utilizzare ACRA in un progetto di libreria?
- 2. È possibile utilizzare Angular con il motore di template Jinja2?
- 3. È possibile rilevare se il testo è più lungo di una riga nel mio div?
- 4. Come rilevare la pressione di un tasto in Angular 2?
- 5. Utilizzare la libreria di digitazione di python per specificare più di un possibile tipo
- 6. Aggiunta di un evento ng-clic all'interno di un filtro
- 7. È possibile utilizzare la libreria D3 con l'elettrone (shell Atom)?
- 8. ngTouch ngClick non lo fa bolla
- 9. È possibile utilizzare pipe nel codice in Angular 2?
- 10. È possibile rilevare la musica non iPod?
- 11. È possibile acquisire un sito Web di Angular JS
- 12. Utilizzare clang matcher per rilevare la sequenza di modelli
- 13. È possibile ascoltare un evento di condivisione post AddThis?
- 14. Set clic lungo listener per ListView
- 15. Evento a lungo contatto Android
- 16. È possibile rilevare la connessione LTE utilizzando l'SDK di iOS?
- 17. Come rilevare se un tipo lungo è effettivamente NULL?
- 18. Posso rilevare la fonte di un focus? (Javascript, jQuery)
- 19. È possibile rilevare l'uscita di un'applicazione?
- 20. Android - È possibile disabilitare il clic lungo del pulsante home per evitare il task manager?
- 21. È possibile utilizzare la libreria Parsec di Haskell per implementare un parser di discesa ricorsivo con backup?
- 22. come implementare un listener di clic lungo su un listview
- 23. È possibile utilizzare trusted.readyState per rilevare la fine del caricamento dinamico degli script?
- 24. Libreria Java per la conversione di un indirizzo IPv6 lungo nella sua forma compressa
- 25. Java: è possibile rilevare se un tasto viene premuto senza utilizzare un listener?
- 26. mappe android: Come fare un clic lungo su una mappa?
- 27. È possibile associare un evento in un DataTamplate Silverlight?
- 28. Come rilevare un clic in qualsiasi punto di un SearchView
- 29. È possibile utilizzare Resharper per rimuovere un inizializzatore di oggetti?
- 30. Modifica ritardo lungo clic
Perché puntare a un repository biforcato? –
@ PhươngNguyễn Poiché il repository da biforcarsi è obsoleto, non viene più mantenuto attivamente, non contiene tag di versione e al momento in cui ho postato questo non supportava nemmeno bower. Ho scavato nel codice di tutte le diverse versioni e la versione monospazio è la migliore. – Egg
Inoltre non sono sicuro del motivo per cui così tante persone fanno downvoting di questa risposta. Sarebbe bello se qualcuno di loro pubblicasse ragioni per cui potesse essere migliorato. Ho utilizzato questa soluzione in più progetti angolari di produzione/enterprise ormai da quasi un anno e ha funzionato abbastanza bene, e sin da ora ngTouch ha ancora alcuni problemi seri e manca di supporto per diversi gesti. Se conosci qualche opzione migliore, ti preghiamo di dirlo. – Egg