javascript - 如何响应 AngularJS 指令中复选框的点击?

标签 javascript angularjs

我有一个 AngularJS directive在以下模板中呈现实体集合:

<table class="table">
  <thead>
    <tr>
      <th><input type="checkbox" ng-click="selectAll()"></th>
      <th>Title</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="e in entities">
      <td><input type="checkbox" name="selected" ng-click="updateSelection($event, e.id)"></td>
      <td>{{e.title}}</td>
    </tr>
  </tbody>
</table>

如您所见,它是一个 <table>其中每一行都可以使用自己的复选框单独选择,或者可以使用位于 <thead> 中的主复选框一次选择所有行。 .非常经典的用户界面。

最好的方法是:

  • 选择单行(即选中复选框时,将所选实体的 ID 添加到内部数组,并将 CSS 类添加到包含实体的 <tr> 以反射(reflect)其选定状态)?
  • 一次选择所有行? (即对 <table> 中的所有行执行前面描述的操作)

我当前的实现是向我的指令添加一个自定义 Controller :

controller: function($scope) {

    // Array of currently selected IDs.
    var selected = $scope.selected = [];

    // Update the selection when a checkbox is clicked.
    $scope.updateSelection = function($event, id) {

        var checkbox = $event.target;
        var action = (checkbox.checked ? 'add' : 'remove');
        if (action == 'add' & selected.indexOf(id) == -1) selected.push(id);
        if (action == 'remove' && selected.indexOf(id) != -1) selected.splice(selected.indexOf(id), 1);

        // Highlight selected row. HOW??
        // $(checkbox).parents('tr').addClass('selected_row', checkbox.checked);
    };

    // Check (or uncheck) all checkboxes.
    $scope.selectAll = function() {
        // Iterate on all checkboxes and call updateSelection() on them??
    };
}

更具体地说,我想知道:

  • 上面的代码属于 Controller 还是应该放在 link 中?功能?
  • 鉴于不一定存在 jQuery(AngularJS 不需要它),进行 DOM 遍历的最佳方法是什么?没有 jQuery,我很难选择父级 <tr>给定的复选框,或选择模板中的所有复选框。
  • 路过$eventupdateSelection()看起来不是很优雅。有没有更好的方法来检索刚刚单击的元素的状态(选中/未选中)?

谢谢。

最佳答案

这就是我做这类事情的方式。 Angular 倾向于支持对 dom 的声明式操作,而不是命令式操作(至少我是这样玩的)。

标记

<table class="table">
  <thead>
    <tr>
      <th>
        <input type="checkbox" 
          ng-click="selectAll($event)"
          ng-checked="isSelectedAll()">
      </th>
      <th>Title</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="e in entities" ng-class="getSelectedClass(e)">
      <td>
        <input type="checkbox" name="selected"
          ng-checked="isSelected(e.id)"
          ng-click="updateSelection($event, e.id)">
      </td>
      <td>{{e.title}}</td>
    </tr>
  </tbody>
</table>

在 Controller 中

var updateSelected = function(action, id) {
  if (action === 'add' && $scope.selected.indexOf(id) === -1) {
    $scope.selected.push(id);
  }
  if (action === 'remove' && $scope.selected.indexOf(id) !== -1) {
    $scope.selected.splice($scope.selected.indexOf(id), 1);
  }
};

$scope.updateSelection = function($event, id) {
  var checkbox = $event.target;
  var action = (checkbox.checked ? 'add' : 'remove');
  updateSelected(action, id);
};

$scope.selectAll = function($event) {
  var checkbox = $event.target;
  var action = (checkbox.checked ? 'add' : 'remove');
  for ( var i = 0; i < $scope.entities.length; i++) {
    var entity = $scope.entities[i];
    updateSelected(action, entity.id);
  }
};

$scope.getSelectedClass = function(entity) {
  return $scope.isSelected(entity.id) ? 'selected' : '';
};

$scope.isSelected = function(id) {
  return $scope.selected.indexOf(id) >= 0;
};

//something extra I couldn't resist adding :)
$scope.isSelectedAll = function() {
  return $scope.selected.length === $scope.entities.length;
};

编辑:getSelectedClass() 需要整个实体,但它仅使用实体的 ID 调用,现在已更正

关于javascript - 如何响应 AngularJS 指令中复选框的点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872832/

相关文章:

angularjs - 为什么 MongoDB 在表单中的 ng-click 上给出 E11000 重复键错误

javascript - AngularJS表单向导验证

javascript - 安装 npm 模块导致找不到命令

c# - 从列表中获取列值

javascript - 读取 jQuery 中元素的每一行

javascript - 脚本标签中的 Angular 变化值

angularjs - Ng-animate 停止使用 $templateRequest 装饰器工作

javascript - 以 Angular 生成动态下拉列表

javascript - 这种加载外部csv数据的方法有什么问题吗?

当 id 和函数名相同时,不调用 JavaScript 函数