AngularJS 的全选、反选实现

一、需求

  • 要使用 AngularJS 实现 checkbox 的全选、反选。
  • 其中所有项都选中,则全选的 checkbox 也选中。
  • 有一项没有选中,全选的 checkbox 不选中。
  • 点击反选按钮,所有项反选,全选的checkbox 视情况而定,如果再所有项都没有选中的情况下反选等同于全选。

二、思路

  1. 需要获取全选 checkobx 的选中状态。
  2. 需要获取每个项 checkbox 的状态。
  3. 需要获取所有选中的 checkbox 的ng-model。
  4. 需要获取所有选项的数量。(用于和 3 进行比较,来判断是否全部选中)
  5. 需要获取反选按钮的状态,然后所有选中的 checkbox 的 ng-model 置反。

三、实现

  1. index.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>全选与反选Demo</title>
    <script src="js/angular.min.js"></script>
    <script src="js/index.js"></script>
    </head>
    <body ng-app="demo" ng-controller="indexController" >
    <ul>
    <li><input type="checkbox" ng-model="sellect_all" ng-click="selectAll($event, list)">全选 <input type="button" ng-model="invert_all" ng-click="invertAll($event, list)" value="反选"></li>
    <li ng-repeat="entity in list">
    <input type="checkbox" ng-model="select_one[entity.id]" ng-click="selectOne($event,entity.id, list)">{{entity.value}}
    </li>
    </ul>
    </body>
    </html>
  2. index.js

    var app = angular.module('demo',[]);
    
    app.controller("indexController",function($scope){
    // 自定义数据列表
    $scope.list = [{"id": "1","value": "a"},{"id": "2","value": "b"},
    {"id": "3","value": "c"},{"id": "4","value": "d"},
    {"id": "5","value": "e"}]; $scope.selectIds=[];// 选中的ID集合
    $scope.select_one=[]; // 单项是否选中状态集合,以 [{"1":true}...] 的方式存在,实际开发中,id 可能不是数字
    $scope.sellect_all = false; // 全选按钮是否选中
    $scope.invert_all = false; // 反选按钮是否选中 // 全选功能
    $scope.selectAll = function($event, list) {
    // 因为绑定的 sellect_all 有滞后,所以让其等于 $event.target.checked
    $scope.sellect_all = $event.target.checked; if ($scope.sellect_all) {
    angular.forEach(list, function(value) {
    $scope.selectIds.push(value.id);
    $scope.select_one[value.id] = true;
    })
    } else {
    // 实现全不选功能
    $scope.selectIds=[];
    $scope.select_one=[];
    }
    } // 反选功能
    $scope.invertAll = function($event, list) {
    $scope.invert_all = $event.target.checked;
    // 实现反选功能
    $scope.selectIds=[];
    angular.forEach(list, function(value) {
    $scope.select_one[value.id] = !$scope.select_one[value.id];
    if ($scope.select_one[value.id]) {
    $scope.selectIds.push(value.id);
    }
    })
    checkAll();
    } // 单项checkbox选择功能
    $scope.selectOne = function($event, id, list) {
    if($event.target.checked){//如果是被选中,则增加到数组
    $scope.selectIds.push( id);
    }else{
    var idx = $scope.selectIds.indexOf(id);
    $scope.selectIds.splice(idx, 1);//删除
    }
    checkAll();
    } // 检查是否全选
    checkAll = function() {
    // 如果按钮已全部被选,就使全选按钮选中,之所以进行非0判断,是考虑到了在实际环境中数据是服务器响应的。
    if ($scope.selectIds.length != 0 && $scope.list.length == $scope.selectIds.length) {
    $scope.sellect_all = true;
    } else {
    // 如果有的按钮没有被选中,就取消全选
    $scope.sellect_all = false;
    }
    }
    });
  3. 实现效果

AngularJS 的全选、反选实现的更多相关文章

  1. JavaScript、全选反选-课堂笔记

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 关于input全选反选恶心的异常情况

    上一篇讲到:第一次点击全选按钮input显示对勾,第二次则不显示,需要用prop来添加checked属性. 但是用prop会出现一个问题,对勾显示,而checked属性不会被添加(比如:$(" ...

  3. jQuery全选/反选checkbox

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. python: jquery实现全选 反选 取消

    引入这个jquery-1.12.4.js jquery实现全选 反选 取消 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  5. BootStrapt iCheck表单美化插件使用方法详解(含参数、事件等) 全选 反选

    特色: 1.在不同浏览器(包括ie6+)和设备上都有相同的表现 — 包括 桌面和移动设备 2.支持触摸设备 — iOS.Android.BlackBerry.Windows Phone等系统 4.方便 ...

  6. 用javascript实现全选/反选组件

    以下是本人制作的全选/反选 组件,供广大同行参考.指正: 效果如图: 在实现的过程中,全选和全部取消选中这两个功能较为简单,只需用for循环遍历所有复选框为true或false即可.反选也较为简单,也 ...

  7. jquery、js操作checkbox全选反选

    全选反选checkbox在实际应用中比较常见,本文有个不错的示例,大家可以参考下 操作checkbox,全选反选//全选 function checkAll() { $('input[name=&qu ...

  8. jquery、js全选反选checkbox

    操作checkbox,全选反选 //全选 function checkAll() { $('input[name="TheID"]').attr("checked&quo ...

  9. Dom操作--全选反选

    我们经常会在网站上遇到一些多选的情况,下面我就来说说使用Dom写全选反选的思路. 全选思路:首先,我们来分析一下知道,当我们点击"全选"复选框的时候,所有的复选框应该都被选中,那我 ...

随机推荐

  1. 数据库系列(五)之 mysql的伸缩性

    这篇文章,主要讲述mysql的伸缩性.在国内mysql一直都是使用得最多的数据库,在国外也排名前三.mysql是一款开源的.性能较高的数据库. 伸缩性是指在软件设计中,软件(数据库.应用程序)通过特定 ...

  2. QGraphicsItem鼠标旋转控制研究

    在QT场景视图中2D图形项Item的基类为QGraphicsItem,如果我们需要自定义Item则可以从其派生,然后重写boundingRect以及paint虚函数实现图形项的外边界定义以及内容绘制工 ...

  3. 【转载】Gradle学习 第三章:教程

    转载地址:http://ask.android-studio.org/?/article/15 3.1. Getting Started 入门The following tutorials intro ...

  4. Markdown随笔

    Markdown随笔 这两天兴致来了,想尝试一下使用 Markdown. 写这篇博客时我用的是: MarkdownPad 2 关于 MarkdownPad 2 的安装破解网上有很多教程了,这里我就不赘 ...

  5. javascript之DOM(三Element类型)

    Element类型用于表现XML和HTML的元素,提供了对元素标签名.子节点及特性的访问. 要访问标签名可以使用nodeName和tagName属性,其返回值是一样的. <p id=" ...

  6. hdu2126 类01背包(三维数组的二维空间优化)

    题目描述: 对于给出的n个物品,每个物品有一个价格p[i],你有m元钱,求最多能买的物品个数,以及有多少种不同的方案 题目分析: 类似01背包的题目,一般的01背包问题我们遇到的是求n个物品,有m的容 ...

  7. [PAT] 目录

    题号  PAT Basic  PAT Advaced  PAT Top 1001 害死人不偿命的(3n+1)猜想     1002 写出这个数     1003 我要通过!     1004 成绩排名 ...

  8. LCD编程_简单测试

    首先,需要编写一个led_test.c的文件,依据代码框架,在led_test.c中我们能够看到的只是led.c.我们是看不到led_controller.c的.比如说,在led_test.c中,需要 ...

  9. 虚拟机中Windows激活「很抱歉,程序无法在非MBR引导分区上进行激活」

    虚拟机激活 Windows 出现如下错误提示: 很抱歉,程序无法在非MBR引导分区上进行激活 没错,是小马Oem7F7激活工具. 最后使用 KMS 激活成功,下载链接: 链接:https://pan. ...

  10. q1096

    一,看题 1,大概是每个点都来一次BFS标记下应该就可以. 2,你可以想想队列为啥pop()是l++; 3,还是字符你得注意下. 4,x,y,m,n,行列你得搞清楚. 5,这棋盘的破东西.. 6,额, ...