使用ng-repeat

时间:2015-08-24 08:55:35

标签: javascript angularjs

我需要根据条件动态设置行范围值。

我拥有的数组:

 $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的新手。

2 个答案:

答案 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