angular写一个列表的选择全选交互组件的示例


Posted in Javascript onJanuary 22, 2018

开发业务后台经常要用到表格里的选择,全选这种交互。而且不同系统不同场景的UI还不一样。比如:表格里就是简简单单的checkbox;图片列表这种,UI设计师会搞点花样,用户选择一下,会在图片上盖一层半透明的勾选提示等等。我们的系统是用angular 1.X版本开发。所以,我采用angular的装饰性指令编写几个指令,把它们配合在一起使用,来封装这样的场景。这与之前我们遇到的组件的开发思路又不太一样。我们先来分析一下需求及扩展点。

需求分析

  1. 实现单选;
  2. 实现全选;
  3. 可以设置允许多选还是单选。如果多选,有最大选择数限制;
  4. 实现跨页选择。这里的跨页选择指的是切换到下一页后,还能记住上一页的选择。以前我们遇到的选择往往都是只记住当前页,一旦刷新就清空了。这是一个不同的地方;
  5. 要求自己定义UI及交互触发;

设计思路

  1. 这里其实是相同的地方就是选择的交互逻辑,所以重点考虑如何封装这个逻辑。这里的交互逻辑主要是: 2. 点击全选; 3. 点击列表item的选择切换。如果是单选,要清空之前的选择;如果是多选,要检查是否超过最大选择限制;
  2. 再来看一下应用场景相同的地方。我们将设定上下文肯定有一个list数组,一个已选数组。 因此,我们得到如下的指令。

moSelect指令

封装全选逻辑的指令。适应场景:

  1. 有一个list集合;
  2. 每一个item是一个对象;
  3. 跨页选择;

使用方式

<table mo-select="list" select-all-name="isSelectedAll" item-name="item" item-select-name="select" selected-list-name="selectedList" init-selected-list="initSelectedList" allow-multiple-select="false" select-count-limit="2" item-equal-func="itemEqual">
            <thead>
              <tr>
                <th><input type="checkbox" ng-checked="isSelectedAll" mo-select-all></th>
                <th>商户名称</th>
                <th>电话</th>
                <th>地点</th>
                <th>更新时间</th>
                <th>播放</th>
              </tr>
            </thead>
            <tbody>
              <tr ng-repeat="item in list" mo-select-single >
                <td>
                   <input type="checkbox" ng-checked="item.select" mo-select-single1 > 
                </td>
                <td>{{item.name}}</td>
                <td>{{item.tel}}</td>
                <td>{{item.addr}}</td>
                <td>{{item.updateTime|msDateFormat:'YYYY-MM-DD'}}</td>
                <td>
                  <div audio-playable="item.url" play-trigger=".audio-play" pause-trigger=".audio-pause">
                    <button class="btn btn-primary audio-play" ng-show="!audioInfo.playing" >播放</button>
                    <button class="btn btn-primary audio-pause" ng-show="audioInfo.playing" >暂停</button>
                  </div>
                </td>
              </tr>
            </tbody>
          </table>

说明:

1、主要通过三个指令实现全选相关的代码封装;

2、mo-select 是容器指令,定义了全选,以及单选 item 的方法,定义在列表容器dom上;

  1. mo-select的 值是scope的 list 对象,与 ng-repeat 里的 items 一致;
  2. item-name :告诉指令,每一项的对象名,指令会通过该名称在每一项的scope里查找。与ng-repeat里的 item 一致;
  3. select-all-name :全选的状态变量。默认: isSelectedAll
  4. item-select-name : 记录的每一项对象是否选中的变量名,将会存储在 item 对象上,为了避免与现有业务字段重合,可以配置,也可以不配置,默认: select ;
  5. selected-list-name :已选对象列表的变量名。默认: selectedList ;
  6. init-selected-list :初始化选择对象列表。该变量只用于初始化,类似 vue 组件里的 prop 属性;
  7. allow-multiple-select :是否允许多选;
  8. select-count-limit :如果允许多选,最多可以选择多少个。如果不传,则无限;
  9. item-equal-func :对象判等函数,用于封装业务对象自己的判等原则。比如:有些场景是根据id,有些是根据其他业务逻辑。如果不传,默认根据对象的id属性;

3、mo-select-all 全选指令。定义在全选 dom 上,一版是一个 input checkbox 。其值表示在当前scope保存的是否全选的变量名;
4、mo-select-single 单选指令。 定义在每一项 dom 上。可以有两个地方:

  1. 定义在自己的 input chebox 上
  2. 定义在 input 的容器上。类似 tr ,实现点击整行选中。也可以定义在某个单个元素上。

如果要获取已选项,直接在当前scope获取 selected-list-name 指定的变量名即可。

使用步骤:

  1. 在容器定义 mo-select ,根据实际需求,配置相关参数。必须: mo-select , item-name ;
  2. 在需要全选的按钮 dom 上添加 mo-select-all 指令,不需要配置任何参数;
  3. 在 ng-repeat 的单项模板里,在需要添加单选交互的 dom 上添加 mo-select-single 指令,不需要配置任何参数;
  4. 完成配置。

注意事项

  1. mo-select 的值一定要和ng-repeat的 items 一致;
  2. item-name 的值一定要和ng-repeat的 item 一致;

总结

这样的指令在我们的业务开发中使用还是很灵活的。可能看起来配置项有点麻烦,其实大多数都是可以采用默认值的。我们看看它的不同表现形式:

angular写一个列表的选择全选交互组件的示例

angular写一个列表的选择全选交互组件的示例

代码不多,200来行,代码是从项目里摘出来的,不是很复杂,就没做demo,这里分享出来,代码链接。 有兴趣要改进的同学可以拿去随便改。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 获取链接(url)参数的方法[正则与截取字符串]
Feb 09 Javascript
九种js弹出对话框的方法总结
Mar 12 Javascript
jquery处理json数据实例分析
Jun 03 Javascript
jquery增加和删除元素的方法
Jan 14 Javascript
jQuery unbind 删除绑定事件详解
May 24 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
vue中keep-alive的用法及问题描述
May 15 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
Jun 01 Javascript
解决在vue项目中webpack打包后字体不生效的问题
Sep 01 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
angular 服务随记小结
May 06 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 14 Javascript
vue-router 组件复用问题详解
Jan 22 #Javascript
详解webpack多页面配置记录
Jan 22 #Javascript
详解html-webpack-plugin用法全解
Jan 22 #Javascript
js构造函数创建对象是否加new问题
Jan 22 #Javascript
bmob js-sdk 在vue中的使用教程
Jan 21 #Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
Jan 21 #Javascript
Angular17之Angular自定义指令详解
Jan 21 #Javascript
You might like
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
[40:19]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.18
2020/12/19 DOTA
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Python3.2模拟实现webqq登录
2016/02/15 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
python实现微信防撤回神器
2019/04/29 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python matplotlib实时画图案例
2020/04/23 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
简历自我评价怎么写好呢?
2014/01/04 职场文书
行政人事岗位职责
2014/03/17 职场文书
应届毕业生求职信
2014/05/26 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
中层干部考核评语
2015/01/04 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
高中家长意见怎么写
2015/06/03 职场文书
小平您好观后感
2015/06/09 职场文书
Redis中一个String类型引发的惨案
2021/07/25 Redis
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers
js面向对象编程OOP及函数式编程FP区别
2022/07/07 Javascript