我需要根据条件动态设置行范围值。
我拥有的数组:
$scope.approvalitems = [
{ ReqId: '100' Date: '02-02-2015', AssociateID: '346248', },
{ ReqId: '101' Date: '02-02-2015', AssociateID: '346248', },
------------------------------------------
{ ReqId: '102' Date: '06-02-2015', AssociateID: '123456', },
{ ReqId: '103' Date: '06-02-2015', AssociateID: '123456', },
{ ReqId: '104' Date: '06-02-2015', AssociateID: '123456', },
-------------------------------------------
{ ReqId: '105', Date: '07-02-2015', AssociateID: '309645',},
{ ReqId: '106', Date: '07-02-2015', AssociateID: '309645',},
--------------------------------------------
{ ReqId: '107', Date: '08-02-2015', AssociateID: '346248',}
];
需要设置DATE和AssociateID值相同的行跨度值=(项目数)。
我无法使用ng-repeat构建表格,尝试使用group但无法使用filterBy在过滤器中获取Date和AssociateID的唯一元素的计数。寻找解决这个问题的方法。
需要这样。
Date AssociateID Time
-----------|----------|-----------------------
02-02-2015 |346248 | Click here for the time
-----------|----------|
02-02-2015 |346248 |
-----------|----------|----------------------
06-02-2015 |123456 | Click here for the time
-----------|----------|
06-02-2015 |123456 |
-----------|----------|
06-02-2015 |123456 |
-----------|----------|----------------------
07-02-2015 |309645 | Click here for the time
-----------|----------|
07-02-2015 |309645 |
-----------|----------|----------------------
08-02-2015 |346248 | Click here for the time
这是我的Fiddle
那么如何实现这一点,我是否需要在绑定数组之前对其进行排序,如果有的话请指导我或者是否有更好的方法来实现这一点。我是角度js的新手。
答案 0 :(得分:1)
在你的情况下,我会使用一个对象作为地图来排序。
$scope.createObjectMap = function () {
var items = {};
angular.forEach($scope.approvalitems, function (value, key) {
if (!items['id' + value.AssociateID]) { // +id because properties shound not begin with numbers
items['id' + value.AssociateID] = new Array();
}
items['id' + value.AssociateID].push(value);
});
return items;
}
然后我将使用两个ng-repeat,首先迭代对象,然后第二个迭代值(数组)。 看看我的fiddle。
如果有人有更好的解决方案,请告诉我。
答案 1 :(得分:1)
您可以创建一个适用于ngRepeat
指令的过滤器。
但是你必须小心这个摘要周期错误:
达到10 $ digest()次迭代。中止!
您可以收到这些错误,因为我们在每个 $ digest 周期返回不同的对象,或者我们正在多次更改数据。
所以一个很好的选择是Memoizing Angular过滤器来停止摘要错误。您可以使用_.memoize库中的lodash方法使它们运行得更快,并避免令人讨厌的摘要循环。 不要忘记在html中包含 lodash 脚本标记。
所以:
<强>控制器强>
(function(){
function Controller($scope) {
$scope.approvalitems = [
{ ReqId: '101', Date: '02-02-2015', AssociateID: '346248', },
{ ReqId: '102', Date: '02-02-2015', AssociateID: '346248', },
{ ReqId: '103', Date: '06-02-2015', AssociateID: '123456', },
{ ReqId: '104', Date: '06-02-2015', AssociateID: '123456', },
{ ReqId: '105', Date: '06-02-2015', AssociateID: '123456', },
{ ReqId: '106', Date: '07-02-2015', AssociateID: '309645', },
{ ReqId: '107', Date: '07-02-2015', AssociateID: '309645', },
{ ReqId: '108', Date: '08-02-2015', AssociateID: '346248', }
];
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
过滤强>
(function(){
function filter(){
function group(input, search) {
if (!input) { return; }
//Create our filtered object
var filtered = {};
//Split our search params
var field = search.split(',');
//For all input
input.forEach(function(item) {
//Retrieve field param by mapping over the item element
var key = field.map(function(elm){
return item[elm.replace(/ /g,'')];
});
//If our object get the key, retrieve it, otherwise, create an empty array
filtered[JSON.stringify(key)] = filtered[JSON.stringify(key)] || [];
//Push item data into our object
filtered[JSON.stringify(key)].push(item);
});
return filtered;
}
//Memoize the filter function by using lodash memoize
return _.memoize(group);
}
angular
.module('app')
.filter('group', filter);
})();
<强> HTML 强>
<body ng-app="app" ng-controller="ctrl">
<table style="width: 30%" border="3">
<tr>
<th>Date</th>
<th>AssociateID</th>
<th>SwipeSummary</th>
</tr>
<tr ng-repeat="(key, value) in approvalitems | group: 'Date,AssociateID'" >
<td>
<div ng-repeat="item in value">
{{item.Date}}
</div>
</td>
<td>
<div ng-repeat="item in value">
{{item.AssociateID}}
</div>
</td>
<td>
<span>Click here for time</span>
</td>
</tr>
</table>
</body>
您可以看到Working Plunker