2016-06-22 2 views
1

Я не могу заставить выбрать первую строку после применения фильтра. Поэтому, когда я загружаю свою страницу для выбора первого ряда, я использую:выберите первую видимую строку после фильтра ui-grid

 gridApi.selection.selectRow($scope.gridOptions.data[0]); 

это из документации по API, и это понятно. Теперь я пытаюсь выбрать первую строку после фильтра. У меня есть singleFilter функция, которая приходит из официальной документации

$scope.singleFilter = function(renderableRows){ 
      var matcher = new RegExp($scope.filterValue); 
      renderableRows.forEach(function(row) { 
       var match = false; 
       [ 
       'name', 'company', 'email' 
       ].forEach(function(field){ 
        if (field.indexOf('.') !== '-1') { 
         field = field.split('.'); 
        } 
        if (row.entity.hasOwnProperty(field) && row.entity[field].match(matcher) || field.length === 2 && row.entity[field[0]][field[1]].match(matcher)){ 
         match = true; 
        } 

       }); 
       if (!match){ 
        row.visible = false; 
       } 
      }); 
      var rows = $scope.gridApi.core.getVisibleRows(); 

      var first = function(array, n) { 
        if (array == null){ 
        return void 0; 
        } 
        if (n == null) { 
        return array[0]; 
        } 
        if (n < 0) { 
        return []; 
        } 
        return array.slice(0, n); 
      }; 

      console.log(first(rows)) 
      $scope.gridApi.selection.selectRow(first(rows)); 

      return renderableRows; 
     }; 

где я получаю длину видимых строк

  var rows = $scope.gridApi.core.getVisibleRows(); 

через простой скрипт, я получаю первую строку

 var first = function(array, n) { 
       if (array == null){ 
       return void 0; 
       } 
       if (n == null) { 
       return array[0]; 
       } 
       if (n < 0) { 
       return []; 
       } 
       return array.slice(0, n); 
     }; 
     console.log(first(rows)) 

тогда я пытаясь применить выбор

$scope.gridApi.selection.selectRow(first(rows)); 

Но, к сожалению, успеха нет. Где моя ошибка? Я ценю любую помощь. My plunker

ответ

3

Я создал рабочий плункер ниже.

Причина, по которой это не работает, состоит в том, что видимые строки, которые вы получаете, - это все строки, а не только отфильтрованные строки. Причина, по которой все строки связаны с тем, что вы вызываете их перед возвратом фильтра. Я создал логику, используя то, о чем мы хорошо осведомлены на данный момент, а именно: будет возвращен после завершения функции.

http://plnkr.co/edit/LIcpOs7dXda5Qa6DTxFU

var filtered = []; 
for (var i = 0; i < renderableRows.length; i++) { 
    if (renderableRows[i].visible) { 
    filtered.push(renderableRows[i].entity) 
    } 
} 

if (filtered.length) { 
    $scope.gridApi.selection.selectRow(filtered[0]); 
} 
+0

Вау !, работает как волшебство, спасибо за ваше описание, я ценю это! – Anton

Смежные вопросы