如何在AngularJS ui-grid中更改网格时收到通知?

时间:2015-05-27 20:06:27

标签: javascript angularjs angular-ui-grid

如果在ui-grid中有一种方法我可以知道网格是否已完成更新行?(就像正在应用过滤器等)?我希望在网格视图更改后运行一些函数。

我尝试了以下方法:

$scope.filteredRows = $scope.gridApi.core.getVisibleRows($scope.gridApi.grid);

$scope.$watch('filteredRows', function(){console.log('view updated');});

当网格刚刚完成启动时,上述方法有效,之后,它将不再起作用。

我也尝试过使用filterChanged api:

$scope.gridApi.core.on.filterChanged($scope, function() {
    console.log('filter changed');
    foo();
});

此方法的问题在于,虽然我可以在更改过滤器时收到通知,但如果网格非常大,则需要一些时间来完成视图更新,在此之前,函数foo()在网格更新完成之前调用。

任何想法都将受到赞赏。

2 个答案:

答案 0 :(得分:11)

我在ui-grid-footer-cell.js中看到了$scope.grid.api.core.on.rowsRendered( $scope, $scope.col.updateAggregationValue );的使用。我不确定rowsRendered何时触发,但是如果它被用来计算聚合和聚合,每当行更改时都需要知识,并且必须在rowsProcessors完成运行后运行,那么这是一个很好的机会这就是你想要的。

编辑:使用它的框架将是:

  1. 定义可见行更改时要调用的函数

    var myFunction = function() { do some stuff };

  2. 设置此函数,以便在呈现行时调用

    $scope.gridApi.core.on.rowsRendered( $scope, myFunction );

答案 1 :(得分:1)

好吧,我找到了一个解决方法,为了在网格更新后调用该函数,这需要一些时间,我在filterChanged事件中添加了延迟:

$scope.gridApi.core.on.filterChanged($scope, function() {
    console.log('filter changed');
    $timeout(foo(),800);
});

要使用$timeout,您需要先将其添加到控制器中。