2015-03-12 3 views
20

У меня есть кнопка на моей странице с идентификатором = «viewQuestions» на странице:

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

Мой код проверки ключевых хитов, как это:

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

и в контроллере:

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

Когда я запускаю этот код и нажмите ENTER, то я получаю эту ошибку:

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) 

Может ли кто-нибудь дать мне совет по этому вопросу. Я просто хочу имитировать нажатие кнопки при нажатии клавиши ENTER. Я пробовал решения с формами, но это не соответствует моим довольно сложным потребностям.

+0

Попробуйте это, <класс = кнопка "БТН" ID = "ABC" нг-клик = "FunctionName()"> Пример и определить эту функцию на угловой рамки как $ объема. functionName = function() {} – mbaljeetsingh

+0

Извините, но я хочу, чтобы пользователь мог видеть кнопку, измененную на состояние щелчка и обратно. Решение Ashad делает это, но оно не работает, когда щелчок кнопки инициируется другим событием, таким как нажатие клавиши. – Alan2

ответ

29

Ваше событие click вызывает цикл дайджеста, противоречащий текущему циклу дайджест, $timeout поможет вам в этой ситуации. Wrap click событие внутри $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> 

Код

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

Все, что вы пишете в ng-click будет вызван.

Working Fiddle

+0

Это действительно работает !!! – RolandoCC

+0

Я не могу, потому что не мой вопрос. – RolandoCC

+0

'$ timeout' за нулевые миллисекунды работал как шарм. Благодаря! – Kon