2015-05-27 10 views
5

Jeśli istnieje sposób w ui-grid, że mogę wiedzieć, że siatka kończy aktualizowanie wierszy (tak jak filtr jest stosowany itp.)? Chcę uruchomić jakąś funkcję po zmianach widoku siatki.Jak otrzymać powiadomienie o zmianie siatki w systemie AngularJS ui-grid?

Próbowałem następujące metody:

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

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

Powyższe podejście działa, gdy tylko zakończy inicjowanie siatki, po tym, że nie będzie już pracować.

Próbowałem też za pomocą filterChanged API:

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

Problem z tej metody jest to, że chociaż mogę otrzymywać powiadomienia, gdy filtr zostanie zmieniona, ale jeśli siatka jest bardzo duży, potrzebuje trochę czasu Zakończ aktualizowanie widoku, a przed nim funkcja foo() jest wywoływana przed zakończeniem aktualizacji siatki.

Każdy pomysł zostanie doceniony.

Odpowiedz

10

Widziałem wykorzystanie $scope.grid.api.core.on.rowsRendered($scope, $scope.col.updateAggregationValue); w ui-grid-footer-cell.js. Nie jestem pewien dokładnie, kiedy rowsRendered strzela, ale biorąc pod uwagę, że jest używany do obliczania agregacji i agregacji, wymaga wiedzy, gdy wiersze są zmieniane, i musi działać po zakończeniu wierszyProcessors, istnieje duża szansa, że ​​jest to, czego chcesz.

EDIT: ramy używać byłoby:

  1. Zdefiniuj funkcję, którą chcesz się połączyć, gdy widoczne rzędy zmieniły

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

  2. Ustaw tę funkcję, aby być wywoływane, gdy wiersze są renderowane:

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

+0

Zaktualizowany w edycji, aby pokazać, jak z niego korzystać – PaulL

+0

Dziękuję @PauL, to działa! Pytanie uzupełniające, w jaki sposób pozwolić funkcji myFunction() wykonywać tylko po wprowadzeniu tekstu filtru i renderowaniu siatki. Teraz mojaFunkcja() będzie wykonywana za każdym razem, gdy zmieni się siatka, podobnie jak w grupowaniu, rozwijaniu i zwijaniu siatka będzie również wywoływała funkcję myFunction(). Jeszcze raz dziękuję za poświęcony czas. – Tony

+0

Można również wykryć filterChanged i ustawić flagę + limit czasu, który zresetuje tę flagę. Następnie możesz sprawdzić tę flagę w rowsRendered. Alternatywnie możesz po prostu nie martwić się i pozwolić swojej funkcji działać, gdy emitowany jest rowsRendered. – PaulL

1

Cóż, znalazłem obejście, w celu wywołania funkcji po siatka jest aktualizowany, który zajmuje trochę czasu, dodałem opóźnienie filterChanged zdarzenia:

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

Aby użyć $timeout, musisz najpierw dodać to do swojego kontrolera.

Powiązane problemy