最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

AngularJS中的Directive自定義一個(gè)表格

 更新時(shí)間:2016年01月25日 11:52:20   作者:Darren Ji  
本篇文章給大家介紹在angularjs中自定義一個(gè)有關(guān)表格的directive,涉及到angularjs directive相關(guān)知識(shí),對本文感興趣的朋友一起學(xué)習(xí)吧

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

● 表格結(jié)構(gòu)

<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>

● 點(diǎn)擊某個(gè)th,就對該列進(jìn)行排序
● 可以給表頭取別名
● 可以設(shè)置某個(gè)列是否顯示
● 表格下方有一行顯示總行數(shù)

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

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

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

columnmap負(fù)責(zé)給列取別名,并且決定是否顯示某個(gè)列。

如何實(shí)現(xiàn)呢?

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); 

具體來說,

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

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

加載表格大致分成了三個(gè)步驟,加載表頭,加載表格體,加載統(tǒng)計(jì)行。

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

加載表頭的時(shí)候,用到了一個(gè)根據(jù)原始列名獲取別名的方法。

//根據(jù)原始列名獲取列的別名,并考慮是否隱藏列的情況
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方法中,用到了一個(gè)根據(jù)原始列名

//比如根據(jù)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;
//監(jiān)視集合
sscope.$watchCollection('datasource', render);
//給表頭th綁定事件
wireEvents();
//初始化表格
function render(){
if(scope.datasource && scope.datasource.length){
table += tableStart;
table += renderHeader();
table += renderRows() + tableEnd;
//加載統(tǒng)計(jì)行
renderTable();
}
}
//給th添加click事件
function wireEvents()
{
element.on('click', function(event){
if(event.srcElement.nodeName === 'TH'){
//獲取列的名稱
var val = event.srcElement.innerHTML;
//根據(jù)列的別名獲取原始列名
var col = (scope.columnmap) ? getRawColumnName(val) : val;
if(col){
//對該列進(jìn)行排序
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'}
//根據(jù)原始列名獲取別名,并考慮了是否顯示列的情況
var val = getColumnName(prop);
if(val){
//visibleProps存儲(chǔ)的是原始列名
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){
//當(dāng)前遍歷的原始列名是否在visibleProps集合中,該集合存儲(chǔ)的是原始列名
if(visibleProps.indexOf(prop) > -1){
rows += '<td>' + row[prop] + '</td>';
}
}
rows += '</tr>';
}
rows = '<tbody>' + rows + '</tbody>';
return rows;
}
//加載統(tǒng)計(jì)行
function renderTable(){
table += '<br /><div class="rowCount">' + scope.datasource.length + '行</div>';
element.html(table);
table = '';
}
//根據(jù)列的別名獲取原始列名
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);
}
//比如根據(jù)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;
} 
//根據(jù)原始列名獲取列的別名,并考慮是否隱藏列的情況
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自定義一個(gè)表格的相關(guān)知識(shí),希望對大家有所幫助。

相關(guān)文章

  • Angular事件之不同組件間傳遞數(shù)據(jù)的方法

    Angular事件之不同組件間傳遞數(shù)據(jù)的方法

    這篇文章主要介紹了Angular事件之不同組件間傳遞數(shù)據(jù)的方法,利用Angular Event在不同組件之間傳遞數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • angularjs select 賦值 ng-options配置方法

    angularjs select 賦值 ng-options配置方法

    下面小編就為大家分享一篇angularjs select 賦值 ng-options配置方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • AngularJs導(dǎo)出數(shù)據(jù)到Excel的示例代碼

    AngularJs導(dǎo)出數(shù)據(jù)到Excel的示例代碼

    本篇文章主要介紹了AngularJs導(dǎo)出Excel的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • AngularJS使用angular-formly進(jìn)行表單驗(yàn)證

    AngularJS使用angular-formly進(jìn)行表單驗(yàn)證

    這篇文章主要介紹了AngularJS使用angular-formly進(jìn)行表單驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • angular.js指令中transclude選項(xiàng)及ng-transclude指令詳解

    angular.js指令中transclude選項(xiàng)及ng-transclude指令詳解

    這篇文章主要研究一下如何使用ng-transclude指令,以及指令的transclude選項(xiàng)的相關(guān)資料,文中介紹的非常詳細(xì),并給出了完整的示例代碼大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。
    2017-05-05
  • 淺析webapp框架AngularUI的demo

    淺析webapp框架AngularUI的demo

    這篇文章主要介紹了淺析webapp框架AngularUI的demo以及對demo的簡單修改,需要的朋友可以參考下
    2014-12-12
  • 利用Angular.js編寫公共提示模塊的方法教程

    利用Angular.js編寫公共提示模塊的方法教程

    最近工作中會(huì)經(jīng)常遇到一些公用提示,使用框架自帶很多時(shí)候不方便所以便自己編寫了一個(gè)公共提示模塊,下面這篇文章主要介紹了利用Angular.js編寫公共提示模塊的方法教程,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05
  • Angular.js去除頁面中顯示的空行方法示例

    Angular.js去除頁面中顯示的空行方法示例

    這篇文章主要介紹了Angular.js去除頁面中顯示的空行方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • 詳解Angular2響應(yīng)式表單

    詳解Angular2響應(yīng)式表單

    這篇文章主要介紹了詳解Angular2響應(yīng)式表單,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Angular2之二級(jí)路由詳解

    Angular2之二級(jí)路由詳解

    今天小編就為大家分享一篇Angular2之二級(jí)路由詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論

嘉黎县| 梁平县| 陆川县| 香格里拉县| 来凤县| 宁陕县| 长阳| 台东县| 康马县| 扎兰屯市| 喀什市| 普定县| 高安市| 沁源县| 慈利县| 开原市| 思茅市| 仁寿县| 鹤峰县| 泊头市| 罗田县| 洪洞县| 綦江县| 集贤县| 洪雅县| 清水河县| 富顺县| 宿迁市| 石嘴山市| 察隅县| 昌邑市| 商河县| 安龙县| 长兴县| 太白县| 孝昌县| 东光县| 全椒县| 武夷山市| 平谷区| 资溪县|