0

我有一个小事件处理程序响应这样的向上/向下键......

    $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;

};
4

1 回答 1

0

所以有一种方法可以在 Angular 中处理这个问题而不会触发错误。基本上,无论何时运行,angular 都会获取此更改$digest。我在这里遇到的问题是我的changeIndex方法没有触发$digest,所以我必须$apply手动调用。

但是,当应用程序启动时,该changeIndex方法会在$digest仍在运行时被调用,这会触发错误,因为您无法$digest在另一个调用$digest.

Angular 确实提供了一种方法来判断当前是否$digest正在运行,因此$apply应该像这样处理对的调用......

$scope.listIndex += val
if(!$$phase) $scope.$apply();

如果$$phase为真,则 Angular 当前正在运行$digest,我们的更改将被自动拾取。如果$$phase为假,那么我们需要$apply手动触发。

虽然这是一个修复程序,但我仍然希望不必手动调用 $apply。感觉有点像手动引用计数,并且以这种方式工作的方法对我来说很有趣。

于 2013-09-08T11:04:35.970 回答