特定のキー押下をコントローラーのスコープで指定された関数にバインドするディレクティブを作成しようとしていますが、すべてのコールバック関数が、バインディングを含むオブジェクトの最後のコールバック関数によってオーバーライドされているようです。イベントを同じ結果にバインドするために、keymaster.jsとmousetrap.jsを使用してみました。
Javascript コード:
angular.module('app', ['directives', 'controllers']);
angular.module('directives', [])
.directive('keypress', [function () {
return function (scope, element, attrs) {
// console.log(scope, element, attrs);
var attribute = scope.$eval(attrs.keypress || '{}');
for (var k in attribute) {
console.log('binding ' + k + ' as ' + attribute[k]);
Mousetrap.bind(k, function() { return attribute[k](scope, element); });
}
};
}]);
angular.module('controllers', [])
.controller('TodoController', function($scope) {
$scope.shortcuts = {
'w': function () { console.log('w'); },
's': function () { console.log('s'); },
'a': function () { console.log('a'); },
'd': function () { console.log('d'); }
};
});
HTML ファイル:
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.js"></script>
<script src="https://raw.github.com/ccampbell/mousetrap/master/mousetrap.min.js"></script>
<script src="/javascript/app.js"></script>
</head>
<body>
<div ng-app="app">
<div ng-controller='TodoController' keypress='shortcuts'>Foo</div>
</div>
</body>
</html>
「w」、「a」、「s」、または「d」のどれを押しても、常に「d」がコンソールに書き込まれるのはなぜですか?