2013-12-21 7 views
23

Diese Plunkr hat 2 Links. Auf der linken Seite wird die ng-click-Direktive mit dem eingesteckten eckigen Touch-Modul verwendet. Wie in der eckigen Touch-Modul-Beschreibung für ng-click erwähnt, sollte der ng-click-Link keine 300ms Verzögerung haben. Aber wenn Sie es auf mobilen Geräten testen, ist dies immer noch der Fall.AngularJS: ngTouch 300ms Verzögerung

So verhindert Plunkr die korrekte Funktionalität, weil es in einem iFrame oder ähnlichem ausgeführt wird oder ist es erforderlich, Fastclick.js in das Projekt einzufügen, damit die Anweisung korrekt funktioniert? Ich verstehe es nicht, bitte hilf mir.

Beispiel: http://plnkr.co/NRRrmMFaIKg2zLu5C1Tg

edit: die example in dem AngularJS docs sind auch nicht arbeiten. Sie haben das Winkel-Touch-Modul noch nicht einmal eingebaut.

+0

Also anscheinend ist dies immer noch ein [Problem] (https://github.com/angular/angular.js/issues/2548) seit eckigen 1.2.0, die noch nicht gelöst ist. Zum Glück können Sie fastclick.js einfach einfügen und jeder ng-Klick wird dann schnell ausgelöst. Sie fügen einfach die fastclick.js-Datei zu Ihrem Projekt hinzu und fügen ihren Bootstrap-Code außerhalb eines beliebigen Winkels ein. ** FYI ** Ich habe die Plunkr aus dem Beispiel bearbeitet, um die Leistung zwischen einigen fastclick-Methoden zu testen. Es scheint, dass die ng-click-Direktive die wenigsten Klicks erkennt, wenn sie häufig [test] (http://plnkr.co/edit/Av5FRS3oSJe17PyLPwiq?p=preview) angeklickt wird. – strangfeld

+0

Hey! .. hast du eine Lösung für dieses Problem gefunden? – Mackelito

+2

@Mackelito Wegen der Einschränkungen von ngTouch, die nur 300ms Verzögerung auf der NG-Click-Direktive entfernt, verwende ich fastclick.js jetzt. Das Problem, das ich hatte, war, dass ich Fastclick instanziierte, bevor die Bibliothek geladen wurde. Deshalb hat es nicht funktioniert. Wrapping in angle.run() löste mein Problem, indem Fastlick instanziiert, wenn das DOM ein Angular bereit ist. – strangfeld

Antwort

56

Weil das anggles ngTouch-Modul nur die 300ms Verzögerung auf ng-click-Anweisungen entfernt, verwende ich jetzt fastclick.js, was perfekt mit eckigen harmoniert.

Am Anfang funktionierte es nicht für mich, weil ich die Fastclick-Bibliothek angeschlossen hatte, bevor das Skript geladen wurde, bevor das DOM fertig war. Ich habe das behoben, indem ich die Funktion in die run block meiner eckigen App eingepackt habe. Diese Funktion führt Code aus, nachdem das DOM bereit ist.

angular.module('myModule', []). 
    run(function() { 
    FastClick.attach(document.body); 
    }); 

Auf diese Weise wird durch die auf den latest screencast AngularJS youtube Kanal vorgeschlagen.

+0

Was ist der Zeitstempel für, wenn er das erwähnt? Ich habe versucht, schnelle Weiterleitung durch das Video – Danger14

+0

@ Danger14 http://youtu.be/xOAG7Ab_Oz0?t=20m48s nur beobachten Sie es für etwa 1 Minute in und Sie werden es sehen;) – strangfeld

+0

Funktioniert nicht richtig mit eckigen Tooltip – Pascalius

0

Ich habe dies meine eigene Richtlinie, indem er gelöst, die für beide touchstart und mousedown Ereignisse (oder touchend/mouseup, etc.) hört. Um zu entdupen, setze ich ein Flag, wenn ein Berührungsereignis eintritt, und wenn das Flag gesetzt ist, ignoriere ich alle Mausereignisse (da Berührungsereignisse vor Mausereignissen passieren, führt das Nichtduppen zu doppelten Bränden auf mobilen Geräten).

appControllers.controller('AppCtrl', ['$scope', 
function($scope) { 
    $scope._usingTouch = false; 
    /* app code */ 
}]).directive('lkClick', [function() { 
    return function(scope, element, attr) { 
    var fn = function() { 
     scope.$apply(function() { 
      scope.$eval(attr.lkClick); 
     }); 
    } 

    element.on('touchstart', function(event) { 
     scope._usingTouch = true; 
     lk(); 
    }); 

    element.on('mousedown', function(event) { 
     if(!scope._usingTouch) 
     lk(); 
    }); 
    }; 
}]); 

Dann können Sie die lk-click="javascript()" Direktive in Ihrer App html hinzufügen.

Die Verwendung von Fastclick ist einfacher und schneller, aber dies ist anpassbarer und erfordert nicht das Laden von Fastclick-Code.

+2

Es sollte gut funktionieren, aber Sie müssen sich von Ereignissen auf dem Scope-Desaster abmelden, sonst Sie werden die Speicherlecks in Ihrer App haben. Verwenden Sie einfach element.off (). –

Verwandte Themen