開發業務後臺常常要用到表格裏的選擇,全選這種交互。並且不一樣系統不一樣場景的UI還不同。好比:表格裏就是簡簡單單的checkbox;圖片列表這種,UI設計師會搞點花樣,用戶選擇一下,會在圖片上蓋一層半透明的勾選提示等等。咱們的系統是用angular 1.X版本開發。因此,我採用angular的裝飾性指令編寫幾個指令,把它們配合在一塊兒使用,來封裝這樣的場景。這與以前咱們遇到的組件的開發思路又不太同樣。咱們先來分析一下需求及擴展點。vue
封裝全選邏輯的指令。適應場景:git
<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>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in list" mo-select-single >
<td>
<input type="checkbox" ng-checked="item.select" mo-select-single >
</td>
<td>{{item.name}}</td>
<td>{{item.tel}}</td>
<td>{{item.addr}}</td>
<td>{{item.updateTime|dateFormat:'YYYY-MM-DD'}}</td>
</tr>
</tbody>
</table>
複製代碼
說明:github
mo-select
是容器指令,定義了全選,以及單選item
的方法,定義在列表容器dom上;
mo-select的
值是scope的list
對象,與ng-repeat
裏的items
一致;item-name
:告訴指令,每一項的對象名,指令會經過該名稱在每一項的scope裏查找。與ng-repeat裏的item
一致;select-all-name
:全選的狀態變量。默認:isSelectedAll
item-select-name
: 記錄的每一項對象是否選中的變量名,將會存儲在item
對象上,爲了不與現有業務字段重合,能夠配置,也能夠不配置,默認:select
;selected-list-name
:已選對象列表的變量名。默認:selectedList
;init-selected-list
:初始化選擇對象列表。該變量只用於初始化,相似vue
組件裏的prop
屬性;allow-multiple-select
:是否容許多選;select-count-limit
:若是容許多選,最多能夠選擇多少個。若是不傳,則無限;item-equal-func
:對象判等函數,用於封裝業務對象本身的判等原則。好比:有些場景是根據id,有些是根據其餘業務邏輯。若是不傳,默認根據對象的id屬性;mo-select-all
全選指令。定義在全選dom
上,一版是一個input checkbox
。其值表示在當前scope保存的是否全選的變量名;mo-select-single
單選指令。 定義在每一項dom
上。能夠有兩個地方:
input chebox
上input
的容器上。相似tr
,實現點擊整行選中。也能夠定義在某個單個元素上。若是要獲取已選項,直接在當前scope獲取selected-list-name
指定的變量名便可。數組
mo-select
,根據實際需求,配置相關參數。必須:mo-select
,item-name
;dom
上添加mo-select-all
指令,不須要配置任何參數;ng-repeat
的單項模板裏,在須要添加單選交互的dom
上添加mo-select-single
指令,不須要配置任何參數;mo-select
的值必定要和ng-repeat的items
一致;item-name
的值必定要和ng-repeat的item
一致;這樣的指令在咱們的業務開發中使用仍是很靈活的。可能看起來配置項有點麻煩,其實大多數都是能夠採用默認值的。咱們看看它的不一樣表現形式: bash
代碼很少,200來行,代碼是從項目裏摘出來的,不是很複雜,就沒作demo,這裏分享出來,代碼連接。有興趣要改進的同窗能夠拿去隨便改。dom