AngularJS在按键上更改多行选择ng-grid属性

时间:2013-09-30 09:21:50

标签: angularjs ng-grid

我在视图中定义了以下网格

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

我想只在按下ctrl键时允许multiSelect。所以我在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

有没有简单的解决方案?或者我的代码中缺少什么?

2 个答案:

答案 0 :(得分:6)

批准的“hacky”答案对我们来说不够干净,所以我们依靠beforeSelectionChange上的事件参数构建了一个稍微强大的版本,而不是做出讨厌的键绑定。 这也适用于您添加此事件回调的任何网格,因为它不需要引用任何特定的自定义CSS类或ID,而只需使用可靠的ng-grid类。

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键或使用多选复选框),如果是,则进行多选。 如果用户只是单击行中的任何其他位置,并且多重选择处于活动状态,我们将删除所有当前选择,以便之后只选择一个目标行。

答案 1 :(得分:4)

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

解决方案是durty,但它确实有效。

基于mabi的评论...