国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

AngularJS中的Directive自定義一個表格

2019-11-20 10:42:17
字體:
來源:轉載
供稿:網友

先給大家說下表格的需求:

● 表格結構

<table><thead><tr><th>Name</th><th>Street</th><th>Age</th></tr></thead><tbody><tr><td>></td><td>></td><td>></td></tr></tbody></table><div>4行</div>

● 點擊某個th,就對該列進行排序
● 可以給表頭取別名
● 可以設置某個列是否顯示
● 表格下方有一行顯示總行數

我們希望表格按如下方式展示:

<table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>

以上,datasource的數據源來自controller中$scope.customers,大致是{name: 'David',street: '1234 Anywhere St.',age: 25,url: 'index.html'}這樣的格式,具體略去。

columnmap負責給列取別名,并且決定是否顯示某個列。

如何實現呢?

Directive大致是這樣的:

var tableHelper = function(){var template = '',link = function(scope, element, attrs){}return {restrict: 'E',scope: {columnmap: '=',datasource: '='},link:link,template:template}; }angular.module('directiveModule').directive('tableHelper', tableHelper); 

具體來說,

首先要監視datasource的變化,一旦有變化,就重新加載表格。

scope.$watchCollection('datasource', render);//初始化表格function render(){if(scope.datasource && scope.datasource.length){table += tableStart;table += renderHeader();table += renderRows() + tableEnd;//加載統計行renderTable();}} 

加載表格大致分成了三個步驟,加載表頭,加載表格體,加載統計行。

//加載頭部function renderHeader(){var tr = '<tr>';for(var prop in scope.datasource[0]){//{name: 'David',street: '1234 Anywhere St.',age: 25,url: 'index.html'}//根據原始列名獲取別名,并考慮了是否顯示列的情況var val = getColumnName(prop);if(val){//visibleProps存儲的是原始列名visibleProps.push(prop);tr += '<th>' + val + '</th>';}}tr += '</tr>';tr = '<thead>' + tr '</thead>';return tr;}//加載行function renderRows(){var rows = '';for(var i = 0, len = scope.datasource.length; i < len; i++){rows += '<tr>';var row = scope.datasource[i];for(var prop in row){//當前遍歷的原始列名是否在visibleProps集合中,該集合存儲的是原始列名if(visibleProps.indexOf(prop) > -1){rows += '<td>' + row[prop] + '</td>';}}rows += '</tr>';}rows = '<tbody>' + rows + '</tbody>';return rows;}//加載統計行function renderTable(){table += '<br /><div class="rowCount">' + scope.datasource.length + '行</div>';element.html(table);table = '';} 

加載表頭的時候,用到了一個根據原始列名獲取別名的方法。

//根據原始列名獲取列的別名,并考慮是否隱藏列的情況function getColumnName(prop){if(!scope.columnmap) return prop;//得到[{name: 'Name'}]var val = filterColumnMap(prop);if(val && val.length && !val[0].hidden) return val[0][prop];else return null;}

在getColumnName方法中,用到了一個根據原始列名

//比如根據name屬性,這里得到[{name: 'Name'}]//[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]function filterColumnMap(prop) {var val = scope.columnmap.filter(function(map) {if (map[prop]) {return true;}return false;});return val;}

具體代碼如下:

(function(){var tableHelper = fucntion(){var template = '<div class="tableHelper"></div>',link = function(scope, element, attrs){var headerCols = [], //表頭列們tableStart = '<table>',tableEnd = '</table>',table = '',visibleProps = [],//可見列sortCol = null,//排序列sortDir =1;//監視集合sscope.$watchCollection('datasource', render);//給表頭th綁定事件wireEvents();//初始化表格function render(){if(scope.datasource && scope.datasource.length){table += tableStart;table += renderHeader();table += renderRows() + tableEnd;//加載統計行renderTable();}}//給th添加click事件function wireEvents(){element.on('click', function(event){if(event.srcElement.nodeName === 'TH'){//獲取列的名稱var val = event.srcElement.innerHTML;//根據列的別名獲取原始列名var col = (scope.columnmap) ? getRawColumnName(val) : val;if(col){//對該列進行排序sort(col);}}});}//給某列排序function sort(col){if(sortCol === col){sortDir = sortDir * -1;}sortCol = col;scope.datasource.sort(function(a,b){if(a[col] > b[col]) return 1 * sortDir;if(a[col] < b[col]) return -1 * sortDir;return 0;});//重新加載表格render();}//加載頭部function renderHeader(){var tr = '<tr>';for(var prop in scope.datasource[0]){//{name: 'David',street: '1234 Anywhere St.',age: 25,url: 'index.html'}//根據原始列名獲取別名,并考慮了是否顯示列的情況var val = getColumnName(prop);if(val){//visibleProps存儲的是原始列名visibleProps.push(prop);tr += '<th>' + val + '</th>';}}tr += '</tr>';tr = '<thead>' + tr '</thead>';return tr;}//加載行function renderRows(){var rows = '';for(var i = 0, len = scope.datasource.length; i < len; i++){rows += '<tr>';var row = scope.datasource[i];for(var prop in row){//當前遍歷的原始列名是否在visibleProps集合中,該集合存儲的是原始列名if(visibleProps.indexOf(prop) > -1){rows += '<td>' + row[prop] + '</td>';}}rows += '</tr>';}rows = '<tbody>' + rows + '</tbody>';return rows;}//加載統計行function renderTable(){table += '<br /><div class="rowCount">' + scope.datasource.length + '行</div>';element.html(table);table = '';}//根據列的別名獲取原始列名function getRawColumnName(friendlyCol) {var rawCol;//columnmap =[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]scope.columnmap.forEach(function(colMap) {//{name: 'Name'}for (var prop in colMap) {if (colMap[prop] === friendlyCol) {rawCol = prop;break;}}return null;});return rawCol;}function pushColumns(rawCol, renamedCol) {visibleProps.push(rawCol);scope.columns.push(renamedCol);}//比如根據name屬性,這里得到[{name: 'Name'}]//[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]function filterColumnMap(prop) {var val = scope.columnmap.filter(function(map) {if (map[prop]) {return true;}return false;});return val;} //根據原始列名獲取列的別名,并考慮是否隱藏列的情況function getColumnName(prop){if(!scope.columnmap) return prop;//得到[{name: 'Name'}]var val = filterColumnMap(prop);if(val && val.length && !val[0].hidden) return val[0][prop];else return null;}};return {restrict: 'E',scope: {columnmap: '=',datasource: '='},link:link,template:template};};angular.module('directiveModule').directive('tableHelper', tableHelper);}());

以上所述是小編給大家分享的AngularJS中的Directive自定義一個表格的相關知識,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 运城市| 沁源县| 竹山县| 班戈县| 潢川县| 志丹县| 康定县| 连州市| 武宁县| 东辽县| 嵩明县| 吕梁市| 英山县| 怀集县| 会泽县| 乳源| 太白县| 碌曲县| 沭阳县| 南投县| 拉萨市| 临邑县| 方山县| 台湾省| 南开区| 嘉义市| 化州市| 庄浪县| 二连浩特市| 云林县| 疏附县| 搜索| 景泰县| 焦作市| 枞阳县| 元朗区| 建瓯市| 安仁县| 贡嘎县| 清水县| 潞西市|