我有以下数据:
{
"records": [
{
"name": "Visits",
"jan": "25000",
"feb": "31050",
"type" : "number"
},
{
"name": "CPC",
"jan": "52",
"feb": "39",
"type" : "currency"
},
{
"name": "Weather",
"jan": "26",
"feb": "28",
"type" : "temperature"
}
]
}
我在表格中显示以下模板:
<table ng-app="myApp" ng-controller="kpisController">
<thead>
<tr>
<th ng-repeat="(key, val) in objects[0]">{{key}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="object in objects">
<td ng-repeat="(key, val) in object">{{val}}</td>
</tr>
</tbody>
</table>
结果如下表所示:
-----------------------------------------
| name | jan | feb | type |
-----------------------------------------
| Visits | 25000 | 31050 | number |
-----------------------------------------
| CPC | 52 | 39 | currency |
-----------------------------------------
| Weather | 26 | 28 | temperature |
-----------------------------------------
我想要做的是根据&#34;类型&#34;来表示数据的表示方式。由JSON文件提供,以便产生以下结果:
-------------------------------------------
| name | jan | feb | type |
-------------------------------------------
| Visits | 25,000 | 31,050 | number |
-------------------------------------------
| CPC | $52.00 | $39.00 | currency |
-------------------------------------------
| Weather | 26˚C | 28˚C | temperature |
-------------------------------------------
另外,我想隐藏最后一列,以便最终结果如下:
-----------------------------
| name | jan | feb |
-----------------------------
| Visits | 25,000 | 31,050 |
-----------------------------
| CPC | $52.00 | $39.00 |
-----------------------------
| Weather | 26˚C | 28˚C |
-----------------------------
我正在生成JSON文件(而不是从第三方读取),这意味着我可以根据需要更改其结果。
答案 0 :(得分:2)
我认为温度没有内置filter
,但您可以在angularjs中使用number
,currency
过滤器。
你唯一需要做的就是为温度实现自定义角度过滤器, 像,
app.filter('temperature', function() {
return function(input) {
return input+'℃';
};
});
然后格式化对象数组,我在控制器内部做了你可以选择另一种方式来做这样的事情,比如在html中使用过滤器。 (不要忘记将$filter
服务注入控制器。)
angular.forEach($scope.objects, function(value, index) {
value.jan = $filter(value.type)(value.jan);
value.feb = $filter(value.type)(value.feb);
});
这将格式化值并将值重新分配给对象属性。
最后您需要隐藏最后一列,以便您可以根据上次迭代使用ng-if
,ng-hide
或ng-show
,
<td ng-repeat="(key, val) in object" ng-if="!$last">{{ val}}</td>
仅在迭代不是最后一个
时显示这是一个DEMO
或您可能希望使用ajax
获取数据。所以你可以这样做,
$http.get('data.json').success(function(data, status, headers, config) {
$scope.objects = formatData(data);
}).
error(function(data, status, headers, config) {
});
调用函数formatData
来格式化ajax数据,并将格式化数据分配给$scope.objects
。
function formatData(data) {
angular.forEach(data, function(value, index) {
value.jan = $filter(value.type)(value.jan);
value.feb = $filter(value.type)(value.feb);
});
return data;
}
这是一个DEMO
<强>更新强>
使用具有更多对象属性的动态数组
创建一个数组并定义非格式化属性,
var escapeIndexes= ['name', 'type'];
检查属性是否为formattable,如果是格式化的话。如果您有兴趣删除type
属性,也可以在此处执行此操作并删除html中的ng-if
内容,这将更加清晰。 :)
angular.forEach(data, function(value, index) {
angular.forEach(value, function(val, key) {
if(escapeIndexes.indexOf(key) === -1) {
value[key] = $filter(value.type)(val);
}
});
// delete the type property from the object
delete value['type'];
});
这是DEMO
答案 1 :(得分:0)
您可以尝试:
<table ng-app="myApp" ng-controller="kpisController">
<thead>
<tr>
<th ng-repeat="(key, val) in objects[0]">{{key}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="object in objects">
<td ng-repeat="(key, val) in object | filter:type ">{{val}}</td>
</tr>
</tbody>