对我而言,没有任何答案有效(我使用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
- afterSelectionChange x2
- ngGridEventData
- afterSelectionChange x2
所以我不得不用这个:
- 进行反跳操作以确保在延迟期间仅调用一次该函数(超时很低,因为这两个调用成对存在,并且呈现的行检查确保未使用第一个调用)
- 检查渲染的行> 0,以确保在延迟和数据加载可能需要一些时间的慢速系统(或慢速连接)上未触发前两个事件
- (可选)使用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)}); }}));


