このような上/下キーに応答する小さなイベントハンドラーがあります...
$scope.$on('handleDownKey', function(){ changeIndex(1) });
$scope.$on('handleUpKey', function(){ changeIndex(-1) });
function changeIndex(val){
$scope.listIndex += val;
//$scope.$apply();
}
そして、私の見解では、このようなリストがあります
<li ng-class="{selected: listIndex == $index}" ng-repeat="item in items">
<p>{{item.title}}</p>
<p>{{item.desc}}</p>
</li>
私が抱えている問題は、行listIndex
のコメントを外したときにのみ変更がビューに反映されることです。$scope.apply()
しかし、その行のコメントを外すとError: $digest already in progress
、アプリの読み込み時にメッセージが表示されます。
私の推測では、Angular の方法でこれを行っているわけではありませんが、このような例を Angular でどのように記述する必要がありますか?
どこから来たのか疑問に思っている人のためhandleKeyDown
に、キーボード イベントを受け取り、それを KeyboardSrv というサービスに渡すディレクティブがあります。ディレクティブは次のようになります...
myModule.directive('onKeydown', function(KeyboardSrv) {
return function(scope, elm, attrs) {
function applyKeydown() {
scope.$apply(attrs.onKeydown);
};
elm.bind('keydown', function(evt) {
KeyboardSrv.prepareEvent(evt)
});
};
});
そしてサービスはこんな感じ…
function KeyboardSrv($rootScope){
var KeyboardSrv = {};
KeyboardSrv.code;
KeyboardSrv.evt;
KeyboardSrv.prepareEvent = function(evt){
KeyboardSrv.code = evt.which;
KeyboardSrv.evt = evt;
if(KeyboardSrv.code == 40){
KeyboardSrv.broadcastEvent("handleDownKey", evt);
}
if(KeyboardSrv.code == 38){
KeyboardSrv.broadcastEvent("handleUpKey", evt);
}
}
KeyboardSrv.broadcastEvent = function(msg, event){
$rootScope.$broadcast(msg, event);
}
return KeyboardSrv;
};