Как прокрутить ngGrid, чтобы показать текущий выбор?

Я устанавливаю выделение моего ngGrid из JavaScript, вызывая gridOptions.selectItem(). У меня установлено значение multiSelect равным false, поэтому выбирается только одна строка. Я бы хотел, чтобы ngGrid автоматически прокручивал, чтобы показать вновь выбранную строку, но я не знаю, как это сделать: может ли кто-нибудь помочь, пожалуйста?

В связанной теме: могу ли я отключить выбор строки щелчком мыши? Если да, то как?

Отредактировано для добавления

Я также хотел бы отключить клавиатурную навигацию выбранной строки, если это возможно.

Что работало:

Ответ AardVark71 работал. Я обнаружил, что ngGrid определяет свойство ngGrid в переменной gridOptions, которая содержит ссылку на сам объект сетки. Необходимые функции отображаются через свойства этого объекта:

$scope.gridOptions.selectItem(itemNumber, true);
$scope.gridOptions.ngGrid.$viewport.scrollTop(Math.max(0, (itemNumber - 6))*$scope.gridOptions.ngGrid.config.rowHeight);

Моя сетка фиксирована на высоте 13 строк, и моя логика пытается сделать выбранную строку отображаемой в середине сетки.

Я по-прежнему хотел бы отключить изменения мыши и клавиатуры в выборе, если это возможно.

Что также работает:

Это, вероятно, ближе к пути Angular и достигает того же конца:

// This $watch scrolls the ngGrid to show a newly-selected row as close to the middle row as possible
$scope.$watch('gridOptions.ngGrid.config.selectedItems', function (newValue, oldValue, scope) {
            if (newValue != oldValue && newValue.length > 0) {
                var rowIndex = scope.gridOptions.ngGrid.data.indexOf(newValue[0]);
                scope.gridOptions.ngGrid.$viewport.scrollTop(Math.max(0, (rowIndex - 6))*scope.gridOptions.ngGrid.config.rowHeight);
            }
        }, true);

хотя эффект, когда строка выбирается нажатием на нее, может немного расстраиваться.

Ответ 1

Похоже, вы можете использовать метод scrollTop для прокрутки.

См. также http://github.com/angular-ui/ng-grid/issues/183 и следующий плункер из @bryan-watts http://plnkr.co/edit/oyIlX9?p=preview

Пример того, как это могло бы работать, будет следующим:

function focusRow(rowToSelect) {
  $scope.gridOptions.selectItem(rowToSelect, true);
  var grid = $scope.gridOptions.ngGrid;
  grid.$viewport.scrollTop(grid.rowMap[rowToSelect] * grid.config.rowHeight);
}


изменить:

Во второй части вашего вопроса "отключение событий мыши и клавиатуры выбранных строк" ​​было бы лучше начать новый Вопрос. Похоже, вы хотите динамически активировать enableRowSelection на false? Не знаю, возможно ли это.

Ответ 2

Я считаю, что искал то же поведение из ng-grid, что и вы. Следующая функция, добавленная к вашему объекту gridOptions, будет запрещать выбор с помощью клавиш со стрелками (но разрешить, если сдвиг или ctrl удерживается) и прокручивать окно при перемещении вниз по списку с помощью клавиш со стрелками, чтобы всегда отображаемая выбранная строка всегда была видимой

beforeSelectionChange: function(rowItem, event){
    if(!event.ctrlKey && !event.shiftKey && event.type != 'click'){
      var grid = $scope.gridOptions.ngGrid;
      grid.$viewport.scrollTop(rowItem.offsetTop - (grid.config.rowHeight * 2));
      angular.forEach($scope.myData, function(data, index){
        $scope.gridOptions.selectRow(index, false);
      });
    }
    return true;
  },

edit: вот plunkr: http://plnkr.co/edit/xsY6W9u7meZsTJn4p1to?p=preview

Надеюсь, что это поможет!

Ответ 3

Я нашел, что принятый ответ выше не работает с последней версией ui-grid (v4.0.4 - 2017-04-04).

Вот код, который я использую:

$scope.gridApi.core.scrollTo(vm.gridOptions.data[indexToSelect]);

В gripOptions вам необходимо зарегистрировать gridApi в onRegisterApi.

onRegisterApi: function (gridApi) {
   $scope.gridApi = gridApi;
},

Ответ 4

  var grid = $scope.gridOptions.ngGrid;
    var aggRowOffsetTop = 0;
    var containerHeight = $(".gridStyle").height() - 40;
    angular.forEach(grid.rowFactory.parsedData, function(row) {
        if(row.entity.isAggRow) {
            aggRowOffsetTop = row.offsetTop;
        }
        if(row.entity.id == $scope.selectedId) {
            if((row.offsetTop - aggRowOffsetTop) < containerHeight) {
                 grid.$viewport.scrollTop(aggRowOffsetTop);
            } else {
                grid.$viewport.scrollTop(row.offsetTop);
            }
        } 
    });