2013-09-30 19 views
4

我在查看AngularJS关键更改多行选择NG格属性下来

<div class="gridStyle hide" ng-grid="resultsOptions" id="resultsGrid"></div> 

定义的下面的网格我想允许多选只有在按下Ctrl键。所以我在Controller中将multiSelect属性定义为false。

$scope.resultsOptions = { 
    data: 'searchData', 
    selectedItems: $scope.mySelections, 
    multiSelect: false, 
    enableHighlighting: true, 
    enableRowSelection: true 
}; 

在同一个控制器中,我有以下代码将multiSelect设置为true。

$("#resultsGrid").keydown(function (e) { 
    if (e.ctrlKey) { 
     $scope.resultsOptions.multiSelect = true; 
     $scope.$apply(); 
    } 
}); 

当我按下ctrl后启动应用程序multiSelect值更改。但我仍然无法做出多重选择。

我试图使用multiSelect变量,但它不会改变一件事情。

以下示例也不会更改multiSelect属性。但它会更改网格标题。 http://plnkr.co/edit/RwYSG4?p=preview

有没有简单的解决方案?或者我在代码中错过了什么?

回答

4

由于不可能在飞行中更改某些电网选项 (https://github.com/angular-ui/ng-grid/issues/386)。如果在beforeSelectionChange属性的网格中没有按下ctrl,我决定手动取消选择每个元素。

解决方案是durty,但它的工作原理。

基于金马碧的评论...

+0

好的解决方案,我用'(e.keyCode == 16 || e.keyCode == 17)'替换'e.keyCode == 17'来处理SHIFT情况。我认为这应该是ng-grid – mabi

+0

的默认行为,有一点需要注意,就是这不能解释这个事实,即在Mac OS X上的ctrl等价物是命令(so,e.metaKey) –

6

经批准的“哈克”的回答是不够干净了我们,让我们建立了一个稍微更强大的版本依赖关于beforeSelectionChange上的事件参数,而不是进行讨厌的密钥绑定。 这也适用于您添加此事件回调的任何网格,因为它不需要引用任何特定的自定义CSS类或ID,但只使用可靠的ng网格类。

beforeSelectionChange: function(rowItem, event){ 
    if(!event.ctrlKey && !event.shiftKey && $scope.multiSelect && 
     !$(event.srcElement).is(".ngSelectionCheckbox")) 
    { 
      angular.forEach($scope.myData, function(data, index){ 
       $scope.gridOptions.selectRow(index, false); 
      }); 
    } 
    return true; 
} 

这样做是简单的检查,如果我们正在做一个多选操作(按住Ctrl键,Shift键或使用多选复选框),如果是的话,让多选发生。 如果用户只需单击某一行的其他任何位置,并且多重选择处于活动状态,则我们将删除当前的所有选择,以便随后选择一个目标行。

+0

这个up和无论是否按下shift键,向下箭头仍然选择多个。 – getsetbro

+0

请注意,使用此方法时,gridOptions.multiSelect属性必须为true –