AngularJS:如何使用shift和鼠标单击选择多个复选框?

Dim*_*ris 4 javascript checkbox angularjs md-select

是否可以使用Shift和鼠标单击使用AngularJS在表格上选择多个元素?

我有一个表,其中第一列是一个复选框,我想使用SHIFT键和鼠标单击以连续选择多行,可以执行删除,编辑等操作.

示例步骤:

  1. 单击第一行的复选框.
  2. 按住SHIFT键.
  3. 单击第10行的复选框.

结果:将选择前10行.

有谁知道如何使用AngularJS完成这项工作?

sar*_*gue 5

我有类似的要求.虽然更新复选框的正确方法是直接更新模型,但我想要一个更通用的解决方案.

所以我构建了一对指令,因此我可以在任何复选框列表中重复使用它.基本上你用所有复选框包装<multi-checkbox-container>,然后multi-checkbox为每个复选框添加一个属性.代码完成其余的工作.简单易行.

angular
  .module('app', [])
  .controller('MainController', function($scope) {
    var vm = this;

    $scope.checks = {};
    $scope.botigues = [1, 2, 3, 4, 5, 6];

  })
  .component('multiCheckboxContainer', {
    controller: function () {
      var ctrl = this;
      var checkboxes = [];
      var checkboxModels = [];
      var previousClickedCheckbox = null;
      
      ctrl.addCheckbox = addCheckbox;
      ctrl.onCheckboxClick = onCheckboxClick;
      
      function addCheckbox(checkbox, checkboxModelCtrl) {
        checkboxes.push(checkbox);
        checkboxModels.push(checkboxModelCtrl);
      }
      
      function onCheckboxClick(checkbox, shiftKey) {
        var start, end, i, checking;
        if (shiftKey && previousClickedCheckbox) {
          checking = checkbox.prop('checked')
          start = checkboxes.indexOf(previousClickedCheckbox);
          end = checkboxes.indexOf(checkbox);
          if (start > end) {
            start = start + end;
            end = start - end;
            start = start - end;
          }
          for (i = start; i <= end; i++) {
            checkboxes[i].prop('checked', checking);
            checkboxModels[i].$setViewValue(checking);
          }
        }
        previousClickedCheckbox = checkbox;
      }
    }
  })
  .directive('multiCheckbox', function () {
    return {
      restrict: 'A',
      require: ['^^multiCheckboxContainer', 'ngModel'],
      link: function (scope, element, attrs, controllers) {
        var containerCtrl = controllers[0];
        var ngModelCtrl = controllers[1];
        containerCtrl.addCheckbox(element, ngModelCtrl);
        
        element.on('click', function (ev) {
          containerCtrl.onCheckboxClick(element, ev.shiftKey);
        });
      }
    };
  });
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.2/angular.min.js"></script>
<div ng-app="app" ng-controller="MainController as vm">
  <multi-checkbox-container>
    <div ng-repeat="botiga in botigues">
      <input type="checkbox" multi-checkbox ng-model="checks[botiga]">
      <label>Botiga {{botiga}}</label>
    </div>
  </multi-checkbox-container>
  <p>checks = {{ checks }}</p>
</div>
Run Code Online (Sandbox Code Playgroud)