2015-03-28 4 views
0

В настоящее время я создаю сайт AngularJS с игрой. Здесь я хочу использовать клавиатуру для возобновления/приостановки и управления игрой. Код я должен добавить EventListener следующий:Keydown/Keyup вызывается 7 раз

$window.addEventListener('keydown', function(e) { 
    if ($scope.gameState.playing) { 
     for (var control in controls) { 
      if (controls.LEFT.indexOf(e.keyCode) > -1) { 
       gameEngine.startLeft(); 
      } else if (controls.RIGHT.indexOf(e.keyCode) > -1) { 
       gameEngine.startRight(); 
      } else if (controls.POWERJUMP.indexOf(e.keyCode) > -1) { 
       gameEngine.powerJump(); 
      } else if (controls.PAUSE.indexOf(e.keyCode) > -1) { 
       $scope.pauseGame(); 
      } 
     } 
    } 
}); 

содержания функции не очень важно, но моя проблема в том, что она вызывается 7 раз каждый раз, когда я нажать клавишу. То же самое с keyup. Однако быстро или медленно я нажимаю.

var GameApp = angular.module('GameApp', []); 
GameApp.controller('GameController', function($scope, $timeout, $window) 

Приведенный выше код - это то, как я создаю приложение и контроллер углов с аргументом $ window.

Я не мог найти решение для этого. Надеюсь, кто-нибудь знает, почему это происходит.

+0

Как вы называете $ window.addEventListener? Внутри какого контроллера? Это внутри директивы? Сколько раз инициализируется эта директива? Это поможет узнать разметку вашего приложения, чтобы помочь вам – Loupax

+0

Также имейте в виду, что если $ window.addEventListener находится внутри GameController, если у вас есть маршрутизация, то для GameController можно инициализировать много раз, считывая прослушиватель событий каждый раз. – Loupax

ответ

1

Дикая догадка: обработчик события зарегистрирован 7 раз?

Чтобы проверить что-то вроде:

$window.addEventListener('keydown', function(e) { 
    if(e.iAmNotAlone) { 
    throw new Error('Oh dear!'); 
    } 

    e.iAmNotAlone = true; 

    /* for control in control thingy goes here */ 
}); 

настраиваете вы это в одноэлементной части службы или в какой-то контроллер (который будет воссоздан каждый раз, и может объяснить это поведение)?

+0

Его никогда не бросают. Поэтому я думаю, что это не проблема. – JeroenJK

+0

Тем не менее, вы, вероятно, захотите переместить этот 'addEventListener' из контроллера и в службу (singleton). Слушатель событий в противном случае протекает и воссоздается каждый раз, когда контроллер воссоздается. – null

+0

Я только один раз позвоню контроллеру, но я все равно сделаю это. Когда я получил время. спасибо – JeroenJK

Смежные вопросы