我有一个小事件处理程序响应这样的向上/向下键......
$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;
};