angular寫(xiě)一個(gè)列表的選擇全選交互組件的示例
開(kāi)發(fā)業(yè)務(wù)后臺(tái)經(jīng)常要用到表格里的選擇,全選這種交互。而且不同系統(tǒng)不同場(chǎng)景的UI還不一樣。比如:表格里就是簡(jiǎn)簡(jiǎn)單單的checkbox;圖片列表這種,UI設(shè)計(jì)師會(huì)搞點(diǎn)花樣,用戶(hù)選擇一下,會(huì)在圖片上蓋一層半透明的勾選提示等等。我們的系統(tǒng)是用angular 1.X版本開(kāi)發(fā)。所以,我采用angular的裝飾性指令編寫(xiě)幾個(gè)指令,把它們配合在一起使用,來(lái)封裝這樣的場(chǎng)景。這與之前我們遇到的組件的開(kāi)發(fā)思路又不太一樣。我們先來(lái)分析一下需求及擴(kuò)展點(diǎn)。
需求分析
- 實(shí)現(xiàn)單選;
- 實(shí)現(xiàn)全選;
- 可以設(shè)置允許多選還是單選。如果多選,有最大選擇數(shù)限制;
- 實(shí)現(xiàn)跨頁(yè)選擇。這里的跨頁(yè)選擇指的是切換到下一頁(yè)后,還能記住上一頁(yè)的選擇。以前我們遇到的選擇往往都是只記住當(dāng)前頁(yè),一旦刷新就清空了。這是一個(gè)不同的地方;
- 要求自己定義UI及交互觸發(fā);
設(shè)計(jì)思路
- 這里其實(shí)是相同的地方就是選擇的交互邏輯,所以重點(diǎn)考慮如何封裝這個(gè)邏輯。這里的交互邏輯主要是: 2. 點(diǎn)擊全選; 3. 點(diǎn)擊列表item的選擇切換。如果是單選,要清空之前的選擇;如果是多選,要檢查是否超過(guò)最大選擇限制;
- 再來(lái)看一下應(yīng)用場(chǎng)景相同的地方。我們將設(shè)定上下文肯定有一個(gè)list數(shù)組,一個(gè)已選數(shù)組。 因此,我們得到如下的指令。
moSelect指令
封裝全選邏輯的指令。適應(yīng)場(chǎng)景:
- 有一個(gè)list集合;
- 每一個(gè)item是一個(gè)對(duì)象;
- 跨頁(yè)選擇;
使用方式
<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>商戶(hù)名稱(chēng)</th> <th>電話(huà)</th> <th>地點(diǎn)</th> <th>更新時(shí)間</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>
說(shuō)明:
1、主要通過(guò)三個(gè)指令實(shí)現(xiàn)全選相關(guān)的代碼封裝;
2、mo-select 是容器指令,定義了全選,以及單選 item 的方法,定義在列表容器dom上;
- mo-select的 值是scope的 list 對(duì)象,與 ng-repeat 里的 items 一致;
- item-name :告訴指令,每一項(xiàng)的對(duì)象名,指令會(huì)通過(guò)該名稱(chēng)在每一項(xiàng)的scope里查找。與ng-repeat里的 item 一致;
- select-all-name :全選的狀態(tài)變量。默認(rèn): isSelectedAll
- item-select-name : 記錄的每一項(xiàng)對(duì)象是否選中的變量名,將會(huì)存儲(chǔ)在 item 對(duì)象上,為了避免與現(xiàn)有業(yè)務(wù)字段重合,可以配置,也可以不配置,默認(rèn): select ;
- selected-list-name :已選對(duì)象列表的變量名。默認(rèn): selectedList ;
- init-selected-list :初始化選擇對(duì)象列表。該變量只用于初始化,類(lèi)似 vue 組件里的 prop 屬性;
- allow-multiple-select :是否允許多選;
- select-count-limit :如果允許多選,最多可以選擇多少個(gè)。如果不傳,則無(wú)限;
- item-equal-func :對(duì)象判等函數(shù),用于封裝業(yè)務(wù)對(duì)象自己的判等原則。比如:有些場(chǎng)景是根據(jù)id,有些是根據(jù)其他業(yè)務(wù)邏輯。如果不傳,默認(rèn)根據(jù)對(duì)象的id屬性;
3、mo-select-all 全選指令。定義在全選 dom 上,一版是一個(gè) input checkbox 。其值表示在當(dāng)前scope保存的是否全選的變量名;
4、mo-select-single 單選指令。 定義在每一項(xiàng) dom 上??梢杂袃蓚€(gè)地方:
- 定義在自己的 input chebox 上
- 定義在 input 的容器上。類(lèi)似 tr ,實(shí)現(xiàn)點(diǎn)擊整行選中。也可以定義在某個(gè)單個(gè)元素上。
如果要獲取已選項(xiàng),直接在當(dāng)前scope獲取 selected-list-name 指定的變量名即可。
使用步驟:
- 在容器定義 mo-select ,根據(jù)實(shí)際需求,配置相關(guān)參數(shù)。必須: mo-select , item-name ;
- 在需要全選的按鈕 dom 上添加 mo-select-all 指令,不需要配置任何參數(shù);
- 在 ng-repeat 的單項(xiàng)模板里,在需要添加單選交互的 dom 上添加 mo-select-single 指令,不需要配置任何參數(shù);
- 完成配置。
注意事項(xiàng)
- mo-select 的值一定要和ng-repeat的 items 一致;
- item-name 的值一定要和ng-repeat的 item 一致;
總結(jié)
這樣的指令在我們的業(yè)務(wù)開(kāi)發(fā)中使用還是很靈活的。可能看起來(lái)配置項(xiàng)有點(diǎn)麻煩,其實(shí)大多數(shù)都是可以采用默認(rèn)值的。我們看看它的不同表現(xiàn)形式:
代碼不多,200來(lái)行,代碼是從項(xiàng)目里摘出來(lái)的,不是很復(fù)雜,就沒(méi)做demo,這里分享出來(lái),代碼鏈接。 有興趣要改進(jìn)的同學(xué)可以拿去隨便改。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AngularJS基礎(chǔ) ng-model-options 指令簡(jiǎn)單示例
本文主要介紹AngularJS ng-model-options 指令,這里對(duì)ng-model-options指令的基本資料進(jìn)行整理,有需要的小伙伴可以參考下2016-08-08淺談Angular HttpClient簡(jiǎn)單入門(mén)
本篇文章主要介紹了淺談Angular HttpClient 簡(jiǎn)單入門(mén),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Angular4.x通過(guò)路由守衛(wèi)進(jìn)行路由重定向?qū)崿F(xiàn)根據(jù)條件跳轉(zhuǎn)到相應(yīng)的頁(yè)面(推薦)
這篇文章主要介紹了Angular4.x通過(guò)路由守衛(wèi)進(jìn)行路由重定向,實(shí)現(xiàn)根據(jù)條件跳轉(zhuǎn)到相應(yīng)的頁(yè)面,這個(gè)功能在網(wǎng)上商城項(xiàng)目上經(jīng)常會(huì)用到,下面小編給大家?guī)?lái)了解決方法一起看看吧2018-05-05AngularJS ngModel實(shí)現(xiàn)指令與輸入直接的數(shù)據(jù)通信
這篇文章主要介紹了AngularJS ngModel實(shí)現(xiàn)指令與輸入直接的數(shù)據(jù)通信的相關(guān)資料,需要的朋友可以參考下2016-09-09AngularJS extend用法詳解及實(shí)例代碼
這篇文章主要介紹了AngularJS extend用法詳解的相關(guān)資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)理解,需要的朋友可以參考下2016-11-11