$ timeout如何调用afterSelectionChange函数?

时间:2014-06-07 15:19:11

标签: angularjs ng-grid

我正在尝试获取足够的信息来解决这个问题,只是想要一些帮助来理解角度内部的情况。

ng-grid有很多问题,但是我找到了一个我不理解的“修复”。

我有一个网格,有足够的行填充可见区域。如果单击不同的行,则调用afterSelectionChange方法。如果在点击网格后我使用箭头键移动焦点,它只会在网格滚动时调用该回调。

所以我每隔半秒输入$ timeout来打印所选行,看看它是否正在更改所选行而只是不调用回调,这就解决了问题。现在每次用键盘移动光标时,回调都会触发,即使回调中发生的唯一事情是$ log.debug()。

  1. 这是因为$ timeout导致框架内发生了类似$ apply或$ digest的事情吗?
  2. 如果是这种情况,为什么键盘不会导致这种情况发生?
  3. 编辑:@tasseKATT的选项

        $scope.callGridOptions = {
            data: 'callRecords',
            multiSelect: false,
            sortInfo: {fields:['startOn'], directions:['asc']},
            columnDefs: [  ...
            ],
            afterSelectionChange: $scope.onCallChange,
            selectedItems: $scope.selectedCalls
        };
    

    最后,我可以将超时代码减少到:

        function ngGridFixer() {
            // Presence of this timer causes the ngGrid to correctly react to up/down arrow and call the
            // afterSelectionChange callback like it is supposed to.
            $timeout(ngGridFixer, 500);
        }
        ngGridFixer();
    

    我把它放在了rootcope中,因为问题发生在应用程序的所有页面上。

1 个答案:

答案 0 :(得分:0)

$ log是Angular框架的一部分,由它处理的任何东西都可能执行之前制定的监视。换句话说,通过调用$ log.debug()打印出结构,你可能基本上运行范围。$ digest每半秒,这会导致回调触发。如果取出$ timeout函数内的所有内容,或者使用console.log,则回调可能不会触发

半正确地执行此操作的方法是使用类似ngKeydown的内容。

编辑: $ timeout执行范围内的函数。默认情况下为$ apply。 https://docs.angularjs.org/api/ng/service/ $ timeout(invokeApply)。我没有意识到这一点。所以基本上你的代码是调用范围。$每半秒应用一次。