2013-08-29 74 views
12

我的問題是thisquestion擴展在頁面加載角ngGrid選擇行

Getting select rows from ng-grid?

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

我需要一個行要在頁面加載選擇,我需要避免聽'ngGridEventData'

調用$ scope.gridOptions.selectRow(2,true);由於電網尚未加載,因此控制器主體發生故障。

避免監聽ngGridEventData是因爲我需要控制器來監聽之前觸發的事件,並基於該事件我需要選擇nggrid行。

有什麼想法?

回答

4

對於我來說,一切答案的工作(我用NG-電網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以確保冷杉在延遲和數據加載可能需要一些時間的慢速系統(或慢速連接)上不會觸發st 2事件
  • (可選)使用rowItem.selected可以避免另一個「bug」,因爲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)}); 
    } 
})); 
14

添加$timeout到控制器,並做到這一點:

$timeout(function() { 
    $scope.gridOptions.selectRow(2, true); 
}); 

例子:http://plnkr.co/edit/hDv7b8?p=preview

+1

爲什麼要有時間出來嗎?有關它在角度文檔中的任何信息? – Jaanus

+1

我需要把因爲? – Jaanus

+0

糟糕。您需要將它放在$ timeout中,因爲在創建Controller時網格未初始化。另一種方法是制定一項指令。 – user508994

2

好了,答案是很久以前授予,但我仍然認爲,它有一個代碼味道(沒有冒犯海報,但它次優的。

我所做的是使用網格的ngGridEventData事件。

您必須小心,因爲它會多次觸發(每行增加一次),但是,因爲我們知道將填充網格的數據的大小,並且由於該事件允許我們檢查多少行已經被渲染,我們可以知道什麼時候最後一行被渲染,這意味着網格沒有被完全顯示(注意:我沒有用滾動網格來測試,有些行可能不可見,有人可以確認是否它在帽子的情況下工作?我個人從不使用滾動網格(它是一個瀏覽器頁面,而不是桌面)。

事情是這樣的:

$scope.$on('ngGridEventData', function (row, event) 
       { 
        if (event == $scope.vehicleTypeGridOptions.gridId) 
        { 
         console.info('@[email protected] vehicleTypeGridOptions grid updated'); 
         var renderedRows = row['targetScope'].renderedRows.length; 
         console.info('renderedRows = ' + renderedRows + '; num data rows = ' + $scope.vehicleTypesGridData.length);      

         if (renderedRows == 0) 
         { 
          return; 
         } 

         // if grid rowcount = dat length then it's fully displayed 
         if (renderedRows == $scope.vehicleTypesGridData.length) 
         { 
          console.log('vehicleTypeGrid fully rendered. Select row zer0, then populate vehicleDescriptionGrid'); 
          console.info('Select row zer0');         
          $scope.vehicleTypeGridOptions.selectItem(0, true); // Grid rendered, select first row 
          // console.table($scope.vehicleTypeGridOptions.selectedItems); 
          var vehicle_type =  $scope.vehicleTypeGridOptions.selectedItems[0].vehicle_type; 
          console.info(vehicle_type);        
         } 
        } 
+2

我可以確認它不適用於滾動網格。該事件只會觸發顯示的行(實際上我不確定它是否爲每行觸發,對我來說,它會觸發4次:兩行渲染0行,兩次渲染6行,然後停止觸發) – valepu

相關問題