Для меня ни один из ответов не сработал (я использую ng-grid v2.0.14).
Выбранный ответ работает, вероятно, потому, что данные либо невелики, либо не загружаются через вызов ajax, иначе вы не можете выбрать строку «до» ngGridEventData, поскольку событие запускается при отображении строк, и вы не можете выбрать строку, если он еще не был обработан.
Если какое-либо из этих условий не выполняется или сетка обрабатывается слишком долго, чем обычно, выбранный ответ не будет работать.
У меня есть прокручиваемая сетка с примерно 2000 строками, но у меня нет ограничений на прослушивание ngGridEventData, поэтому я работал над этим, хотя для меня это странно: ngGridEventData срабатывает ровно 4 раза для меня, дважды до поступления данных из вызова ajax и дважды после него.
Я использовал этот подключаемый модуль jquery http://benalman.com/projects/jquery-throttle-debounce-plugin/ (можно использовать и без jQuery), чтобы сделать так, чтобы функция вызывалась только один раз.
И так как этого недостаточно, функция "selectRow/selectItem" дважды вызывает событие "afterSelectionChange" (по какой-то причине первый раз с неправильной строкой). Это то, что мне нужно было сделать, чтобы убедиться, что событие запускается только один раз и только для правильной строки.
Вот что происходит у меня:
- ngGridEventData (нет триггеров afterSelectionChange, вероятно, потому, что нет отображаемых строк)
- ngGridEventData (нет триггеров afterSelectionChange, вероятно, потому, что нет отображаемых строк)
- Ajax-вызов для получения данных
- задержка (вероятно рендеринг)
- ngGridEventData
- послеSelectionChange x2
- ngGridEventData
- послеSelectionChange x2
Поэтому мне пришлось использовать это:
- debounce, чтобы убедиться, что функция вызывается только один раз во время задержки (время ожидания мало, поскольку вызовы находятся близко друг к другу в паре, а отображаемые строки проверяют, что первый вызов не используется)
- проверьте, чтобы отображаемые строки были> 0, чтобы убедиться, что первые 2 события не запускаются на медленных системах (или медленном соединении), где задержка и загрузка данных могут занять некоторое время.
- При желании используйте rowItem.selected, чтобы избежать другой «ошибки», поскольку событие afterSelectionChange срабатывает дважды даже при выборе строки (один раз для невыбранной строки и один раз для выбранной строки)
- используйте переменную fireOnlyOnce, чтобы избежать двойного вызова функции afterSelectionChange.
Вот пример кода:
$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)});
}
}));
person
valepu
schedule
10.04.2015