当前位置: 首页 > 面试题库 >

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

楚威
2023-03-14
问题内容

我有一个AngularJS
指令,该指令在以下模板中呈现实体集合:

<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>包含该实体的CSS类以反映其所选状态)?
  • 一次选择所有行?(即,针对中的所有行执行上述操作<table>

我当前的实现是将自定义控制器添加到我的指令中:

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??
    };
}

更具体地说,我想知道:

  • 上面的代码是属于控制器还是应该放在link函数中?
  • 鉴于jQuery不一定存在(AngularJS不需要它),那么进行DOM遍历的最佳方法是什么?没有jQuery,我很难选择<tr>一个给定复选框的父级,或者选择模板中的所有复选框。
  • 传递$event给您updateSelection()似乎不是很优雅。有没有更好的方法来检索刚刚单击的元素的状态(选中/未选中)?

谢谢。


问题答案:

这就是我一直在做这种事情的方式。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>

并在控制器中

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进行了调用,现已更正



 类似资料:
  • 我有一个AngularJS指令,它在以下模板中呈现实体集合: 正如你所看到的,这是一个<代码> 最好的方法是什么: 选择单行(即选中复选框时,将所选实体的id添加到内部数组中,并将CSS类添加到

  • 问题内容: 我正在一个angularjs项目上工作,并且在select.not内没有绑定存在问题,但是相同的概念正在另一个select标签和同一html页面中工作。下面是代码。 功能放置在控制器中。 任何人的帮助都是非常可贵的……谢谢。 问题答案: 基于小马的托尼的小提琴: 使用控制器: http://jsfiddle.net/basarat/3y5Pw/43/

  • 问题内容: 我已经编辑了数据,并试图仅获取用户已选择的数据。我不确定该怎么做,这就是我所拥有的: HTML: JS: 我确实以一种方式使它工作-通过向每个对象添加属性并将复选框的更改为,然后可以在函数中对此进行过滤。但是,这似乎效率很低,如果可以避免,我不想在模型中添加额外的属性。 有没有更好的办法 ? 问题答案: 的JavaScript HTML http://plnkr.co/edit/lqt

  • 问题内容: 我喜欢使用指令制作自定义组件。我检查了很多教程,它使我感到困惑,任何人都可以解释指令的工作原理。我计划制造的组件是 呼喊列表的模板将像这样 问题答案: 这是您的指令,带有一些内联注释: 和模板文件: 现在,您可以在代码中使用它,如下所示: 控制器: 视图: 希望这可以帮助!

  • 问题内容: 我正在尝试构建一个指令,该 指令 负责在其声明的元素上 添加更多指令 。例如,我要建立一个指令,需要增加的照顾,和。 如果我尝试添加这些属性然后使用,则显然会生成一个无限循环,因此我正在检查是否已添加所需的属性: 当然,如果我没有该元素,则将设置属性,但不会引导该指令。 这种方法正确还是我做错了?有没有更好的方法来实现相同的行为? UDPATE :鉴于这是实现此目标的唯一方法,是否有一

  • 我是新的java开发人员,我需要你的帮助。我已经看到了类似主题的问答,但我仍然不知道如何处理它,所以我想寻求一些帮助。 我用的是Liferay 6.2 提前感谢您的任何帮助!