我正在尝试获取足够的信息来解决这个问题,只是想要一些帮助来理解角度内部的情况。
ng-grid有很多问题,但是我找到了一个我不理解的“修复”。
我有一个网格,有足够的行填充可见区域。如果单击不同的行,则调用afterSelectionChange方法。如果在点击网格后我使用箭头键移动焦点,它只会在网格滚动时调用该回调。
所以我每隔半秒输入$ timeout来打印所选行,看看它是否正在更改所选行而只是不调用回调,这就解决了问题。现在每次用键盘移动光标时,回调都会触发,即使回调中发生的唯一事情是$ log.debug()。
编辑:@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中,因为问题发生在应用程序的所有页面上。
答案 0 :(得分:0)
$ log是Angular框架的一部分,由它处理的任何东西都可能执行之前制定的监视。换句话说,通过调用$ log.debug()打印出结构,你可能基本上运行范围。$ digest每半秒,这会导致回调触发。如果取出$ timeout函数内的所有内容,或者使用console.log,则回调可能不会触发
半正确地执行此操作的方法是使用类似ngKeydown的内容。
编辑: $ timeout执行范围内的函数。默认情况下为$ apply。 https://docs.angularjs.org/api/ng/service/ $ timeout(invokeApply)。我没有意识到这一点。所以基本上你的代码是调用范围。$每半秒应用一次。