Dla mnie żadna z odpowiedzi nie pracował (używam ng-Grid v2.0.14).
Wybrana odpowiedź działa prawdopodobnie dlatego, że dane nie są duże lub nie są ładowane przez wywołanie ajax, w przeciwnym razie nie można wybrać wiersza "przed" ngGridEventData, ponieważ zdarzenie jest uruchamiane, gdy wiersze są renderowane, a użytkownik nie może wybierz wiersz, jeśli nie został jeszcze wyrenderowany.
Jeśli którykolwiek z tych warunków się nie powiedzie lub siatka zajmie zbyt wiele czasu niż zwykle, aby renderować, wybrana odpowiedź nie będzie działać.
Mam przewijalną siatkę z około 2000 wierszy, ale nie mam żadnych ograniczeń dotyczących odsłuchiwania ngGridEventData, więc pracowałem nad tym, chociaż ma dziwne zachowanie dla mnie: NgGridEventData odpala dokładnie 4 razy dla mnie, dwa razy przed nadejściem danych z wywołania ajax i dwa razy później.
Użyłem tej wtyczki jquery http://benalman.com/projects/jquery-throttle-debounce-plugin/ (można jej używać nawet bez jQuery), aby ją wywołać tylko raz.
A ponieważ to nie wystarczy, funkcja "selectRow/selectItem" wyzwala dwukrotne zdarzenie "afterSelectionChange" (po raz pierwszy z nieprawidłowym wierszem, z jakiegoś powodu).Właśnie to musiałem zrobić, aby upewnić się, że wydarzenie zostało wystrzelone tylko raz i tylko dla prawidłowego rzędu.
To co się dzieje za mną:
- ngGridEventData (bez afterSelectionChange wyzwalacze, prawdopodobnie dlatego, że nie istnieją żadne świadczone rzędy)
- ngGridEventData (bez afterSelectionChange wyzwalacze, prawdopodobnie dlatego, że nie istnieją żadne świadczone rzędy)
- Ajax wywołanie do pobierania danych
- opóźnienie (prawdopodobnie rendering)
- ngGridEventData
- afterSelectionChange x2
- ngGridEventData
- afterSelectionChange x2
więc musiałem użyć tego:
- nieczułości aby upewnić się, że funkcja jest wywoływana tylko raz w czasie opóźnienia (timeout jest niska, ponieważ połączenia są blisko siebie w pary, a wyrenderowane wiersze sprawdzają, czy pierwsze wywołanie nie jest używane)
- Sprawdź, czy wiersze renderowane są> 0, aby upewnić się, że jodła st 2 zdarzenia nie są wyzwalane na wolnych sistemach (lub powolnym połączeniu), gdzie opóźnienie i ładowanie danych może zająć trochę czasu
- Opcjonalnie użyj rowItem.selected, aby uniknąć kolejnego "błędu", ponieważ zdarzenie afterSelectionChange jest uruchamiane dwukrotnie, nawet po wybraniu wiersza (raz dla niezaznaczonego wiersza i raz dla wybranego wiersza) użyj zmiennej fireOnlyOnce, aby uniknąć wywołania podwójnej funkcji afterSelectionChange.
Oto przykładowy kod:
$scope.fireOnlyOnce=true;
$scope.gridOptions = {
//Stuff
afterSelectionChange: function (rowItem) {
if($scope.fireOnlyOnce){
if(rowItem.selected){
//Do stuff
}
} else {
$scope.fireOnlyOnce=true;
}
}
};
$scope.$on('ngGridEventData', jQuery.debounce(100, function (row, event){
var renderedRows = row['targetScope'].renderedRows.length;
if(renderedRows>0){
$scope.fireOnlyOnce=false;
$timeout(function(){$scope.gridOptions.selectRow(2, true)});
}
}));
Dlaczego musi być czas na zewnątrz? Jakieś informacje na ten temat w kątowych dokumentach? – Jaanus
Muszę umieścić, ponieważ? – Jaanus
Ups. Musisz umieścić go w $ timeout, ponieważ siatka nie została zainicjalizowana po utworzeniu kontrolera. Innym sposobem byłoby stworzenie dyrektywy. – user508994