2015-03-12 11 views
20

Ich habe eine Taste auf meiner Seite mit einem id = "viewQuestions" auf einer Seite:

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

Mein Code ist für die wichtigsten Hits wie diese Überprüfung:

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

und in der Steuerung:

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

Wenn ich führen Sie den Code ein und klicken Sie ENTER dann bekomme ich diese Fehlermeldung:

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) 

Kann mir jemand dazu einen Rat geben. Ich möchte nur das Klicken einer Schaltfläche simulieren, wenn die EINGABETASTE gedrückt wird. Ich habe Lösungen mit Formularen versucht, aber es entspricht nicht meinen ziemlich komplizierten Bedürfnissen.

+0

Try this, und diese Funktion auf dem Winkelumfang wie $ Umfang definieren. functionName = function() {} – mbaljeetsingh

+0

Tut mir leid, aber was ich tun möchte, ist, dass der Benutzer sehen kann, dass die Schaltfläche in den angeklickten Zustand und zurück geändert wurde. Ashads Lösung tut dies, aber es funktioniert nicht, wenn der Klick auf die Schaltfläche von einem anderen Ereignis wie einem Tastendruck ausgelöst wird. – Alan2

Antwort

29

Ihr Click-Ereignis führt einen Digest-Zyklus aus, der dem aktuellen Digest-Zyklus widerspricht, $timeout würde Ihnen in dieser Situation helfen. Wrap click event innerhalb $timeout Funktion.

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> 

-Code

$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'); 
      }) 
     }    
    } 
}); 

Was auch immer Sie in ng-click schreiben wird aufgerufen.

Working Fiddle

+0

Es funktioniert !!! – RolandoCC

+0

Ich kann nicht da ist nicht meine Frage. – RolandoCC

+0

'$ Timeout' für null Millisekunden arbeitete wie ein Charme. Vielen Dank! – Kon