2013-08-28 33 views
10

JavaScriptからngGridを選択し、gridOptions.selectItem()を呼び出しています。 multiSelectをfalseに設定しているので、選択された行は1つだけです。新しく選択した行を表示するためにngGridが自動的にスクロールするようにしたいと思いますが、これを行う方法はわかりません:だれでも助けてくれますか?ngGridをスクロールして現在の選択を表示するにはどうすればよいですか?

関連トピック:マウスクリックで行選択を無効にすることはできますか?もしそうなら、どうですか?

を追加するように編集

可能であれば私はまた、選択された行のキーボードナビゲーションを無効にしたいと思います。

何が働いた:

AardVark71の答えは働きました。 ngGridがグリッドオブジェクト自体への参照を保持する変数ngGridgridOptions変数に定義していることがわかりました。

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

マイグリッドは13行ハイに固定され、そして私のロジックは、選択された行がグリッドの中央に表示されるようしよう:必要な機能は、このオブジェクトのプロパティを介して露出しています。

可能であれば、マウスの&キーボードの変更を無効にしたいと思います。

をこれはおそらく、「角度の道」に近いと同じ端実現:行はそれをすることができますクリックして選択されたときに有効であるが

// 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); 

をも働いていた何

少し戸惑う。

+0

これまでに入手したコードを表示できますか?あなたがscrollTopメソッドを利用できるように思えます。 https://github.com/angular-ui/ng-grid/issues/183と@ bryan-wtsの次のようなplunkerも参照してください。http://run.plnkr.co/plunks/oyIlX9/ – AardVark71

+0

OKですこのヒントのおかげで、働いて!文書化されていない 'ngGrid'プロパティがあり、これは実際のグリッド自体への参照を保持する' gridOptions'プロパティに追加されています。ビューポートをスクロールする関数呼び出しは '$ scope.gridOptions.ngGridです。$ viewport.scrollTop(rowNumber * $ scope.gridOptions.ngGrid.config.rowHeight)' AardVark71 - これを回答に更新してください;私はあなたに信用します: どうもありがとう! – Max

+0

うまくいけばうれしいですが、私は答えとしてそれを言い換えるでしょう – AardVark71

答えて

14

スクロールするにはscrollTopメソッドを使用できるようです。

も参照してくださいhttp://github.com/angular-ui/ng-grid/issues/183と、次のように@のブライアン・ワットから次plunker 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); 
} 


編集

の場合を"選択された行のマウスとキーボードのイベントを無効にする"という質問の2番目の部分は、 w質問。あなたはあなたのenableRowSelectionをfalseに動的に設定したいのですか?それが可能かどうかは分かりません。

+1

はい、あなたはこれを動的に設定できます: '$ scope.gridOptions.ngGrid.config.enableRowSelection = true;'。しかし、それはかなりの効果を持っていません。最初の 'gridOptions'に' enableRowSelection = false; 'を設定した場合、マウスクリックは無効になり、オプションが' true'に設定されても無効になりますが、上下の矢印キーは有効のままです。このオプションをオフにすると、選択した行のスタイルの変更も無効になります。これは問題ありません。 – Max

+0

グリッド上でフィルタをアクティブにすると、この解決策は機能しません。誰かがそれについてのアイデアを持っていますか? –

0
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); 
      } 
     } 
    }); 
+0

あなたもいくつかの説明を入れてください –

1

私は自分自身と同じような動作をng-gridから探していたと思います。gridOptionsオブジェクトに追加された次の関数は、矢印キーによる選択を禁止します(ただし、shiftキーまたは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; 
    }, 

編集: http://plnkr.co/edit/xsY6W9u7meZsTJn4p1to?p=preview

希望に役立ちます:ここplunkrです!

1

上記の受け入れられた回答が最新のui-grid(v4.0.4 - 2017-04-04)で動作していないことがわかりました。ここで

は、私が使用するコードです:gripOptionsで

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

、あなたはonRegisterApiでgridApiを登録する必要があります。

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

私はこの問題に遭遇して以来、長い間続いています - それ以来、多くのバージョンがありました!回答リストを最新に保つためにありがとう。 – Max

関連する問題