2015-05-27 59 views
5

如果在ui-grid中有一種方法可以知道網格正在完成更新行(如正在應用過濾器等)?我想在網格視圖更改後運行一些函數。如何在AngularJS 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()

任何想法將不勝感激。

回答

10

我在使用過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);

+0

在編輯中更新以顯示如何使用它 – PaulL

+0

謝謝@PauL,這工作!後續問題,如何讓myFunction()僅在輸入過濾文本時執行並且網格渲染完成。現在myFunction()會在網格發生變化時執行,就像分組,展開和摺疊網格一樣,也會觸發myFunction()。再次感謝您的時間。 – Tony

+0

你也可以監聽filterChanged,並且你可以設置一個標誌+超時值來取消設置該標誌。然後你可以檢查rowRendered中的那個標誌。或者,您可以不用擔心,並在發出rowsRendered時讓函數運行。 – PaulL

1

嗯,我找到了一個解決辦法,以調用網格更新後的功能,這需要一些時間,我加入filterChanged事件延遲:

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

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

相關問題