我的问题是对该问题的扩展

Getting select rows from ng-grid?

朋克-http://plnkr.co/edit/DiDitL?p=preview

我需要在页面加载时选择一行,并且需要避免听'ngGridEventData'

调用$ scope.gridOptions.selectRow(2,true);由于尚未加载网格,因此 Controller 主体中的“故障”失败。

避免监听ngGridEventData的原因是,我需要 Controller 监听之前和基于此触发的事件,因此我需要选择nggrid行。

有任何想法吗?

最佳答案

对我而言,没有任何答案有效(我使用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,以确保在延迟和数据加载可能需要一些时间的慢速系统(或慢速连接)上未触发前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)});
        }
    }));
    

    09-25 18:09