2015-05-27 13 views
5

Se c'è un modo in ui-grid che posso sapere che una griglia è finita di aggiornare le righe? (Come un filtro viene applicato, ecc)? Voglio eseguire alcune funzioni dopo che la vista della griglia è cambiata.Come ricevere una notifica quando la griglia è cambiata nella griglia utente AngularJS?

ho provato il seguente metodo:

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

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

L'approccio di cui sopra funziona quando la griglia appena finito l'avvio, dopo di che, non funzionerà più.

Ho anche provato usando l'filterChanged api:

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

Il problema di questo metodo è che anche se posso essere avvisato quando il filtro viene cambiato, ma se la rete è molto grande, ha bisogno del tempo per terminare l'aggiornamento della vista e, prima, la funzione foo() viene chiamata prima che l'aggiornamento della griglia sia terminato.

Qualsiasi idea sarà apprezzata.

risposta

10

Ho visto l'uso di $scope.grid.api.core.on.rowsRendered($scope, $scope.col.updateAggregationValue); in ui-grid-footer-cell.js. Non sono sicuro esattamente quando viene eseguito il fileRendered, ma dato che viene utilizzato per calcolare le aggregazioni e le aggregazioni richiedono la conoscenza ogni volta che le righe vengono modificate e devono essere eseguite dopo il completamento di rowsProcessors, ci sono buone probabilità che sia quello che vuoi.

EDIT: il quadro da usare sarebbe:

  1. definire una funzione che si desidera chiamare quando le righe visibili sono cambiate

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

  2. Impostare questa funzione per essere chiamato ogni volta che le righe vengono renderizzate

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

+0

Aggiornato in una modifica per mostrare come usarlo – PaulL

+0

Grazie @PauL, che funziona! Una domanda successiva, come lasciare che myFunction() venga eseguito solo quando viene immesso un testo di filtro E il rendering della griglia è completato. Ora myFunction() verrà eseguito ogni volta che la griglia cambierà, come nel raggruppamento, espandere e comprimere la griglia e anche attivare myFunction(). Grazie ancora per il tuo tempo. – Tony

+0

Puoi anche ascoltare filterChanged, e potresti impostare un flag + un timeout che disattiverà quel flag. Quindi puoi controllare quel flag in rowsRendered. In alternativa, potresti non preoccuparti e lasciare che la tua funzione venga eseguita ogni volta che vengono emesse le righeRendered. – PaulL

1

Beh, ho trovato una soluzione, al fine di chiamare la funzione dopo la griglia viene aggiornato, il che richiede un certo tempo, ho aggiunto un ritardo nella filterChanged evento:

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

Per utilizzare il $timeout, è necessario aggiungerlo prima al controller.

Problemi correlati