Heim > Web-Frontend > js-Tutorial > Hauptteil

Direktive in AngularJS zum Anpassen einer Tabelle_AngularJS

WBOY
Freigeben: 2016-05-16 15:18:17
Original
1132 Leute haben es durchsucht

Lassen Sie mich zunächst die Anforderungen für das Formular erläutern:

● Tabellenstruktur

<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>
Nach dem Login kopieren

● Klicken Sie auf eine , um die Spalte zu sortieren
● Sie können dem Header einen Alias ​​
geben ● Sie können einstellen, ob eine bestimmte Spalte angezeigt wird
● Unterhalb der Tabelle befindet sich eine Zeile mit der Gesamtzahl der Zeilen

Wir möchten, dass die Tabelle so aussieht:

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

Oben stammt die Datenquelle der Datenquelle von $scope.customers im Controller und hat ungefähr das Format {Name: 'David', Straße: '1234 Anywhere St.', Alter: 25, URL: 'Index.' .html'} werden die Details weggelassen.

columnmap ist für das Aliasing von Spalten und die Entscheidung verantwortlich, ob eine Spalte angezeigt werden soll.

Wie erreicht man das?

Die Richtlinie sieht ungefähr so ​​aus:

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); 
Nach dem Login kopieren

Konkret

Überwachen Sie zunächst die Änderungen in der Datenquelle. Sobald Änderungen vorliegen, laden Sie die Tabelle neu.

scope.$watchCollection('datasource', render);
//初始化表格
function render(){
if(scope.datasource && scope.datasource.length){
table += tableStart;
table += renderHeader();
table += renderRows() + tableEnd;
//加载统计行
renderTable();
}
} 
Nach dem Login kopieren

Das Laden der Tabelle ist grob in drei Schritte unterteilt: Laden des Tabellenkopfes, Laden des Tabellenkörpers und Laden der Statistikzeilen.

//加载头部
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 = '';
} 
Nach dem Login kopieren

Beim Laden des Tabellenkopfes wird eine Methode verwendet, um den Alias ​​basierend auf dem ursprünglichen Spaltennamen abzurufen.

//根据原始列名获取列的别名,并考虑是否隐藏列的情况
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;
}
Nach dem Login kopieren

In der getColumnName-Methode wird eine Spalte basierend auf dem ursprünglichen Spaltennamen verwendet

//比如根据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;
}
Nach dem Login kopieren

Der spezifische Code lautet wie folgt:

(function(){
var tableHelper = fucntion(){
var template = '
', link = function(scope, element, attrs){ var headerCols = [], //表头列们 tableStart = '', tableEnd = '
', 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 = ''; 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 += '' + val + ''; } } tr += ''; tr = '' + tr ''; return tr; } //加载行 function renderRows(){ var rows = ''; for(var i = 0, len = scope.datasource.length; i < len; i++){ rows += ''; var row = scope.datasource[i]; for(var prop in row){ //当前遍历的原始列名是否在visibleProps集合中,该集合存储的是原始列名 if(visibleProps.indexOf(prop) > -1){ rows += '' + row[prop] + ''; } } rows += ''; } rows = '' + rows + ''; return rows; } //加载统计行 function renderTable(){ table += '
' + scope.datasource.length + '行
'; 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); }());
Nach dem Login kopieren

Das Obige ist das vom Herausgeber geteilte Wissen über das Anpassen einer Tabelle mithilfe der Direktive in AngularJS. Ich hoffe, es wird Ihnen hilfreich sein.

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage