먼저 양식 요구사항을 알려드리겠습니다.
● 테이블 구조
<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>
● 항목을 정렬하려면 해당 항목을 클릭하세요.
● 헤더에 별칭을 지정할 수 있습니다
● 특정 열의 표시 여부를 설정할 수 있습니다
● 표 아래에는 총 행 수를 나타내는 행이 있습니다
우리는 테이블을 다음과 같이 만들고 싶습니다.
<table-helper datasource="customers" clumnmap="[{name: 'Name'}, {street: 'Street'}, {age: 'Age'}, {url: 'URL', hidden: true}]"></table-helper>
위의 데이터 소스의 데이터 소스는 컨트롤러의 $scope.customers에서 가져오며 대략 {name: 'David', street: '1234 Anywhere St.', age: 25, url: 'index' 형식입니다. .html'} , 자세한 내용은 생략됩니다.
columnmap은 열에 별칭을 지정하고 열 표시 여부를 결정하는 역할을 합니다.
어떻게 달성할 수 있나요?
지침은 대략 다음과 같습니다.
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);
구체적으로
먼저 데이터 소스의 변경 사항을 모니터링합니다. 변경 사항이 있으면 테이블을 다시 로드합니다.
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 = '', link = function(scope, element, attrs){ var headerCols = [], //表头列们 tableStart = '
위 내용은 AngularJS에서 Directive를 사용하여 테이블을 사용자 정의하는 방법에 대해 편집자가 공유한 지식입니다. 도움이 되기를 바랍니다.