游乐游手机版
首页/前端开发/文章详情

AngularJS实现多选框分段全选效果完整教程与代码示例

时间:2026-06-17 06:46
AngularJS实现多选框分段全选效果,通过ng-repeat遍历大类及子项,大类复选框绑定selectAll数组,子项绑定isSelected属性。changeAll方法同步子项状态,funcChange方法反向判断大类全选状态,实现父级全选与子项单独勾选的联动逻辑。

AngularJS实现多选框分段全选与取消全选联动

在前端开发中,列表批量选择功能几乎是每个项目都绕不开的常见需求。无论是后台管理系统还是普通Web应用,处理批量操作时总需要与复选框打交道。虽然实现方式多种多样,但核心逻辑基本一致。本文将从AngularJS角度出发,详细拆解一个典型的分段全选场景——既支持按大类全选,又允许在每个大类内部单独勾选子项。简单来说,就是实现“全选父级→子项全部勾选,反选任意子项→父级全选自动取消”的联动效果。

\

HTML结构代码

首先来看模板部分的实现。整体结构非常清晰:外层使用 ng-repeat 指令遍历大类列表(todolist),每个大类内部再通过 ng-repeat 循环渲染子权限项。关键绑定只有两处——大类顶部的复选框负责全选或取消全选,子项复选框则负责单独选中或取消。

角色权限:

{{todotype.type}}

{{obj.name}}

下面对 ng-model 绑定细节做进一步说明:

  • 大类复选框绑定了 $parent.selectAll[$index],其中 $parent 用于跳出当前 ng-repeat 作用域,从而直接访问控制器中的 $scope.selectAll 数组。每个大类对应数组中的一个布尔值,用于控制该组的全选状态。
  • 子项复选框绑定了 obj.isSelected,该属性在数据初始化时动态添加,用于标识每个子项的选中状态。
  • 点击事件分为两种:changeAll($index) 负责大类全选或取消全选时同步所有子项的选中状态;funcChange($parent.$index) 则用于子项状态改变时判断当前大类是否应取消全选。

AngularJS控制器代码实现

首先来看数据初始化部分。从后端接口获取数据后,需要为每个权限项添加 isSelected: false 属性。同时维护一个 selectAll 数组,其长度与大类的数量保持一致,初始值全部设为 false

// 获取数据 这里具体post请求就不写了 
                   $scope.todolist = res.data.data;
                        for(var i = 0; i < $scope.todolist.length; i++) {angular.forEach($scope.todolist[i].permissionList, function(i) {    i.isSelected = false;})
                        }
// 数据类型如下
    $scope.list = [{
                permissionList: [{
                        name: 'Golde',
                        //                  birthday: '2000-01-10',
                        isSelected: false
                    },
                    {
                        name: 'King',
                        //                  birthday: '1990-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Mark',
                        //                  birthday: '19890-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Marie',
                        //                  birthday: '2010-01-10',
                        isSelected: false
                    }
                ],
                type: "制造资源管理"
            }, {
                permissionList: [{
                        name: 'Golde1',
                        //                  birthday: '2000-01-10',
                        isSelected: false
                    },
                    {
                        name: 'King1',
                        //                  birthday: '1990-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Mark1',
                        //                  birthday: '19890-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Marie1',
                        //                  birthday: '2010-01-10',
                        isSelected: false
                    }
                ],
                type: "制造资源管理2"
            }, {
                permissionList: [{
                        name: 'Golde2',
                        //                  birthday: '2000-01-10',
                        isSelected: false
                    },
                    {
                        name: 'King2',
                        //                  birthday: '1990-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Mark2',
                        //                  birthday: '19890-01-10',
                        isSelected: false
                    },
                    {
                        name: 'Marie2',
                        //                  birthday: '2010-01-10',
                        isSelected: false
                    }
                ],
                type: "制造资源管理3"
            }];

以下是两个核心方法的具体实现:

// 这里初始化数组 上来全为空
             $scope.selectAll = [];
            //      对于对象进行操作的时候(点击),会执行funcChange  
            //      判断对象数组中isSelected 是否为 true或false,在决定select是否为true  
            $scope.changeAll = function(index) { //全选/取消全选      
                angular.forEach($scope.todolist[index].permissionList, function(v, k) {
                    v.isSelected = $scope.selectAll[index];
                })
            };
            $scope.funcChange = function(index) { // 当所有都选中时  
                $scope.selectAll[index] = true;
                angular.forEach($scope.todolist[index].permissionList, function(v, k) {
                    $scope.selectAll[index] = $scope.selectAll[index] && v.isSelected;
                });
            };

changeAll 的逻辑非常直观:点击大类复选框时,$scope.selectAll[index] 已通过 ng-model 的双向绑定自动更新为当前复选框的值,随后将该值賦予该大类下所有子项的 isSelected。如此,大类选中则子项全部勾选,大类取消则子项全部清空。

funcChange 相对复杂一些:每次点击子项时都会触发该函数。它先将 $scope.selectAll[index] 设置为 true,然后遍历当前大类所有子项的 isSelected 属性,通过 && 运算符进行累加判断——只要有一个子项未选中,最终结果即为 false,从而将大类复选框置为未全选状态。若所有子项均被选中,大类复选框则会自动点亮。

整个逻辑并不复杂,关键在于充分利用 ng-model 的双向绑定机制以及事件触发的时机。只要掌握了“点击大类时同步子项”和“点击子项时反向判断大类”这两个核心流程,实现分段全选功能就变得轻而易举了。

来源:https://www.jb51.net/javascript/2907684ju.htm
上一篇Angular异步执行学习:zone.js用法详解 下一篇AngularJS $parse与$eval服务用法实例
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Vue应用中异步更新性能问题的优化策略详解
前端开发 · 2026-07-03

Vue应用中异步更新性能问题的优化策略详解

先来看一个令许多开发者感到困惑的场景:明明修改了数据,DOM 却“毫无反应”,无法获取最新的高度,也无法计算正确的坐标。这并非 Vue 的缺陷,反而是它精心设计的性能优化策略。核心在于——你需要学会与它“异步更新”的特性协作,而非硬碰硬。 所谓的“异步更新性能问题”,本质上是一种认知偏差。Vue 的

如何避免原型对象挂载大体积动态数组内存污染
前端开发 · 2026-07-03

如何避免原型对象挂载大体积动态数组内存污染

原型链上的大数组:一个隐蔽的内存冲击波 先给个核心判断:直接在原型对象上挂载一个大体积动态数组,这既不是传统意义上的内存“污染”,也不是安全漏洞那种“污染”,而是一种相当隐蔽但后果严重的内存管理失当。它会导致所有实例共享同一份数据,而且正因为生命周期跟整个原型链绑定得太紧,垃圾回收器(GC)根本看不

利用堆栈信息精准定位显式绑定错误对象致未定义异常
前端开发 · 2026-07-03

利用堆栈信息精准定位显式绑定错误对象致未定义异常

深入追踪:显式绑定传错对象引发的未定义异常 说实话,这类问题在JavaScript开发中相当常见——显式绑定传错了对象,然后方法执行时静默失败、访问undefined、或者抛出TypeError。但真正的难点不在于“报了什么错”,而在于“到底是哪个对象被绑错了”。要解决它,需要跳出堆栈的表层报错信息

ES模块中默认导出和具名导出的执行上下文
前端开发 · 2026-07-03

ES模块中默认导出和具名导出的执行上下文

export default 与具名导出在 ES Module 中的行为机制截然不同,核心差异不在于“值如何传递”,而在于绑定如何建立以及导入时如何使用。先给出总结性结论,再逐一详细拆解。 export default 是一种语法糖,而非真正的变量声明 这种设计容易引起误解。实际上,export d

详解HTML中iframe标签loading=lazy属性实现嵌入内容懒加载方法
前端开发 · 2026-07-03

详解HTML中iframe标签loading=lazy属性实现嵌入内容懒加载方法

先聊聊 loading= "lazy " 这个属性——它本意是让 iframe 实现延迟加载,但实际落地时常常“失效”。这并非程序漏洞,而是浏览器内置的防御机制:只有所有条件同时触发,它才会真正推迟资源请求。比如 src 必须是跨域地址(类似 https: widget example com emb