我如何在 Angular 中创建具有可变数量的列和动态标题的 table?优先使用 ng-tables
How do i create a table with a variable amount of columns and dynamic titles in Angular? pref using ng-tables
我正在尝试使用 ng-tables 从一组数据中创建一个 table。每次的数据可能都不一样。例如,我有这些数据:
var data = [
{name: "St.Gabriels", MeaslesCR: 50, ANC: 30, OPD: 20, SCORE: 100},
{name: "N'Lale", MeaslesCR: 52, ANC: 33, OPD: 20, SCORE: 90},
{name: "Centrum Hospital", MeaslesCR: 20, ANC: 70, OPD: 30, SCORE: 80},
{name: "Something Hospital", MeaslesCR: 20, ANC: 50, OPD: 30, SCORE: 70},
{name: "Wohoo Clinic", MeaslesCR: 50, ANC: 30, OPD: 40, SCORE: 60}];
但我可能不包括 MeaslesCR。
那么如何创建 table 而无需手动创建所有列及其各自的标题?
我试过这样的事情:
var indicators = [];
//Getting indicator names
angular.forEach(data[0], function(value, key){
indicators.push(key);
});
$scope.getTitle = function(i){
return indicators[i];
}
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10 // count per page
}, {
total: data.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var orderedData = params.sorting() ?
$filter('orderBy')(data, params.orderBy()) :
data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
和
<table ng-table="tableParams" class="table">
<tr ng-repeat="user in $data">
<td data-title="getTitle($index)" sortable="Name">
{{user.name}} // pref user.getTitle($index)
</td>
</tr>
</table>
html 代码显然只写入一个单元格,但我能否让它以某种方式写出“$data.length”个单元格(本例 5)?
动态标题使用 getTitle($index) 或其他更好的替代方法?
然后用它们各自的 user.varValue(user.name, user.MeaslesCR 等)?
填充这些列
如果我的问题有点混乱,我很抱歉,因为我觉得我自己也有点混乱。
非常感谢。
做了一些工作,但这是一个有效的 plnkr 可以完成我认为您正在尝试做的事情。
http://plnkr.co/edit/7SqPoD2u323KKzi0SYpa?p=preview
我从另一个 post 讨论如何保证 object 上的迭代顺序的 notSorted
函数。需要确保列和 headers 的顺序相同。如果不需要 headers.
列,则可以简化并删除它
而 ng-if 是为了省去一个我认为也是由 notSorted
函数引入的无关列。如果你去掉 headers.
可能也没有
html:
<table border=1>
<thead>
<tr>
<th ng-repeat="key in notSorted(cols)" ng-init="value=cols[key]">{{value}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in data">
<td ng-if="!$last" ng-repeat="dat in notSorted(row)" ng-init="value=row[dat]">{{value}}</td>
</tr>
</tbody>
</table>
脚本:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.data = [
{name: "St.Gabriels", MeaslesCR: 50, ANC: 30, OPD: 20, SCORE: 100},
{name: "N'Lale", MeaslesCR: 52, ANC: 33, OPD: 20, SCORE: 90},
{name: "Centrum Hospital", MeaslesCR: 20, ANC: 70, OPD: 30, SCORE: 80},
{name: "Something Hospital", MeaslesCR: 20, ANC: 50, OPD: 30, SCORE: 70},
{name: "Wohoo Clinic", MeaslesCR: 50, ANC: 30, OPD: 40, SCORE: 60}
];
$scope.cols = Object.keys($scope.data[0]);
$scope.notSorted = function(obj){
if (!obj) {
return [];
}
return Object.keys(obj);
}
});
在此处找到 notSorted() 函数:
我正在尝试使用 ng-tables 从一组数据中创建一个 table。每次的数据可能都不一样。例如,我有这些数据:
var data = [
{name: "St.Gabriels", MeaslesCR: 50, ANC: 30, OPD: 20, SCORE: 100},
{name: "N'Lale", MeaslesCR: 52, ANC: 33, OPD: 20, SCORE: 90},
{name: "Centrum Hospital", MeaslesCR: 20, ANC: 70, OPD: 30, SCORE: 80},
{name: "Something Hospital", MeaslesCR: 20, ANC: 50, OPD: 30, SCORE: 70},
{name: "Wohoo Clinic", MeaslesCR: 50, ANC: 30, OPD: 40, SCORE: 60}];
但我可能不包括 MeaslesCR。
那么如何创建 table 而无需手动创建所有列及其各自的标题?
我试过这样的事情:
var indicators = [];
//Getting indicator names
angular.forEach(data[0], function(value, key){
indicators.push(key);
});
$scope.getTitle = function(i){
return indicators[i];
}
$scope.tableParams = new ngTableParams({
page: 1, // show first page
count: 10 // count per page
}, {
total: data.length, // length of data
getData: function($defer, params) {
// use build-in angular filter
var orderedData = params.sorting() ?
$filter('orderBy')(data, params.orderBy()) :
data;
$defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
}
});
和
<table ng-table="tableParams" class="table">
<tr ng-repeat="user in $data">
<td data-title="getTitle($index)" sortable="Name">
{{user.name}} // pref user.getTitle($index)
</td>
</tr>
</table>
html 代码显然只写入一个单元格,但我能否让它以某种方式写出“$data.length”个单元格(本例 5)?
动态标题使用 getTitle($index) 或其他更好的替代方法?
然后用它们各自的 user.varValue(user.name, user.MeaslesCR 等)?
填充这些列如果我的问题有点混乱,我很抱歉,因为我觉得我自己也有点混乱。
非常感谢。
做了一些工作,但这是一个有效的 plnkr 可以完成我认为您正在尝试做的事情。
http://plnkr.co/edit/7SqPoD2u323KKzi0SYpa?p=preview
我从另一个 post 讨论如何保证 object 上的迭代顺序的 notSorted
函数。需要确保列和 headers 的顺序相同。如果不需要 headers.
而 ng-if 是为了省去一个我认为也是由 notSorted
函数引入的无关列。如果你去掉 headers.
html:
<table border=1>
<thead>
<tr>
<th ng-repeat="key in notSorted(cols)" ng-init="value=cols[key]">{{value}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="row in data">
<td ng-if="!$last" ng-repeat="dat in notSorted(row)" ng-init="value=row[dat]">{{value}}</td>
</tr>
</tbody>
</table>
脚本:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
$scope.data = [
{name: "St.Gabriels", MeaslesCR: 50, ANC: 30, OPD: 20, SCORE: 100},
{name: "N'Lale", MeaslesCR: 52, ANC: 33, OPD: 20, SCORE: 90},
{name: "Centrum Hospital", MeaslesCR: 20, ANC: 70, OPD: 30, SCORE: 80},
{name: "Something Hospital", MeaslesCR: 20, ANC: 50, OPD: 30, SCORE: 70},
{name: "Wohoo Clinic", MeaslesCR: 50, ANC: 30, OPD: 40, SCORE: 60}
];
$scope.cols = Object.keys($scope.data[0]);
$scope.notSorted = function(obj){
if (!obj) {
return [];
}
return Object.keys(obj);
}
});
在此处找到 notSorted() 函数: