2015-03-12 21 views
20

Mam przycisku na mojej stronie z id = „viewQuestions” na stronie:

<body ng-keydown="key($event);"> 

Mój kod jest sprawdzanie najważniejszych hitów tak:

$scope.key = function ($event) { 
     $scope.$broadcast('key', $event.keyCode) 
    } 

iw sterowniku:

$scope.$on('key', function (e, key) { 
     if (key == 13) { 
      if (ts.test.current && ts.test.userTestId) { 
       document.getElementById("viewQuestions").click(); 
      }    
     } 
    }); 

Kiedy uruchomić kod i kliknij ENTER następnie uzyskać ten błąd:

Error: [$rootScope:inprog] $apply already in progress 
http://errors.angularjs.org/1.3.7/$rootScope/inprog?p0=%24apply 
    at REGEX_STRING_REGEXP (http://localhost:2757/lib/angular/angular.js:63:12) 
    at beginPhase (http://localhost:2757/lib/angular/angular.js:14735:15) 
    at Scope.$get.Scope.$apply (http://localhost:2757/lib/angular/angular.js:14479:11) 
    at HTMLButtonElement.<anonymous> (http://localhost:2757/lib/angular/angular.js:22945:23) 
    at HTMLButtonElement.eventHandler (http://localhost:2757/lib/angular/angular.js:3009:21) 
    at http://localhost:2757/app/tests/controllers/TestsController.js:24:62 
    at Scope.$get.Scope.$broadcast (http://localhost:2757/lib/angular/angular.js:14700:28) 
    at Scope.AppController.$scope.key (http://localhost:2757/app/appController.js:30:20) 
    at $parseFunctionCall (http://localhost:2757/lib/angular/angular.js:12330:18) 
    at ngEventDirectives.(anonymous function).compile.element.on.callback (http://localhost:2757/lib/angular/angular.js:22940:17) 

Czy ktoś może mi doradzić w tej sprawie. Chcę tylko symulować klikanie przycisku po naciśnięciu klawisza ENTER. Próbowałem rozwiązań z formularzami, ale nie spełniało to moich dość skomplikowanych potrzeb.

+0

Spróbuj Przykład i określenie funkcji na zakresu kątowego as $ zakresu. functionName = function() {} – mbaljeetsingh

+0

Przepraszam, ale chcę, aby użytkownik mógł zobaczyć, jak przycisk został zmieniony na kliknięty stan iz powrotem. Rozwiązanie Ashada robi to, ale nie działa, gdy kliknięcie przycisku jest inicjowane przez inne zdarzenie, takie jak naciśnięcie klawisza. – Alan2

Odpowiedz

29

Twoje zdarzenie kliknięcia jest uruchomionym cyklem trawienia, który jest sprzeczny z bieżącym cyklem trawienia, $timeout pomoże ci w tej sytuacji. Zawiń zdarzenie click wewnątrz funkcji $timeout.

Markup

<body ng-app="myApp" ng-controller="testCtrl" ng-keydown="key($event);"> 
    <button id="viewQuestions" type="button" ng-click="isButtonClicked = !isButtonClicked; test();"> Test</button> 
    Is Button Clicked {{isButtonClicked}} 
</body> 

Kod

$scope.$on('key', function (e, key) { 
    if (key == 13) { 
     if (ts.test.current && ts.test.userTestId) { 
      $timeout(function(){ 
       angular.element(document.getElementById("viewQuestions")).trigger('click'); 
      }) 
     }    
    } 
}); 

Cokolwiek piszesz wewnątrz ng-click zostanie sprawdzony.

Working Fiddle

+0

To działa! – RolandoCC

+0

Nie mogę, ponieważ nie jest to moje pytanie. – RolandoCC

+0

'$ timeout' przez zero milisekund działało jak czar. Dzięki! – Kon