如何在 AngularJS 中使用 ng-repeat 创建嵌套结构
How to create nested structure with ng-repeat in AngularJS
ng-repeat 问题,AngularJS 循环
我在 angular js(ionic 1 应用程序)中使用 ng-repeat 创建此循环结构时遇到问题。当我使用 ng-repeat 时,日期会与每个循环中的每个事件一起重复显示。但是我只想显示一次相应事件的日期,如图所示。
image
您可以*使用两个 ng-repeat,一个用于日期,另一个内部 ng-repeat 用于日期下列出的每个事件。例如:
<div ng-repeat="date in $ctrl.dates">
{{date}}
<div ng-repeat="event in $ctrl.events[date]">
<div>event</div>
</div>
</div>
我不知道你的数据结构是什么样的,但你可以很容易地适应它。
*由于使用 groupBy 的其他答案而更新。这个答案很管用。我个人不喜欢使用 groupBy 过滤器,而是选择两个协同工作的数据模型。
您需要一个 groupBy 过滤器,您(手动编写,或)从 angular-filter 模块获得。只需设置 JSON 并将事件和日期列在一起。这是一个小演示,您可以根据自己的示例进行调整:
var app = angular.module('myApp', ['angular.filter']);
app.controller('myCtrl', function($scope) {
$scope.events = [{
"date": "Sept-1",
"event": "Event 1"
},
{
"date": "Sept-1",
"event": "Event 2"
},
{
"date": "Sept-2",
"event": "Event 3"
},
{
"date": "Sept-2",
"event": "Event 4"
},
{
"date": "Sept-3",
"event": "Event 5"
},
]
});
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.17/angular-filter.min.js"></script>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div ng-repeat="(key, value) in events | groupBy: 'date'">
- {{key}}
<div ng-repeat="val in value">
* {{val.event}}
</div>
<br>
</div>
</div>
</body>
</html>
另一种方法是创建一个函数,该函数 returns 仅当日期与前一个日期不同时才为该日期:
$scope.dateIfNew = function(index) {
var event = $scope.events[index];
if (index == 0) return event.date;
var prevEvent = $scope.events[index-1];
if (event.date != prevEvent.date) return event.date;
//else
return "";
};
这只使用一个 ng-repeat
。它避免了嵌套的额外性能开销 ng-repeat
并避免使用第三方库。
演示
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.dateIfNew = function(index) {
var event = $scope.events[index];
if (index == 0) return event.date;
var prevEvent = $scope.events[index-1];
if (event.date != prevEvent.date) return event.date;
//else
return "";
};
$scope.events = [{"date": "Sept-1","event": "Event 1"},
{"date": "Sept-1","event": "Event 2"},
{"date": "Sept-2","event": "Event 3"},
{"date": "Sept-2","event": "Event 4"},
{"date": "Sept-3","event": "Event 5"},
]
});
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="myApp" ng-controller="myCtrl">
<table>
<tr ng-repeat="item in events">
<td>
<b>{{dateIfNew($index)}}</b>
</td>
<td>{{item.event}}</td>
</tr>
</table>
</body>
ng-repeat 问题,AngularJS 循环
我在 angular js(ionic 1 应用程序)中使用 ng-repeat 创建此循环结构时遇到问题。当我使用 ng-repeat 时,日期会与每个循环中的每个事件一起重复显示。但是我只想显示一次相应事件的日期,如图所示。
image
您可以*使用两个 ng-repeat,一个用于日期,另一个内部 ng-repeat 用于日期下列出的每个事件。例如:
<div ng-repeat="date in $ctrl.dates">
{{date}}
<div ng-repeat="event in $ctrl.events[date]">
<div>event</div>
</div>
</div>
我不知道你的数据结构是什么样的,但你可以很容易地适应它。
*由于使用 groupBy 的其他答案而更新。这个答案很管用。我个人不喜欢使用 groupBy 过滤器,而是选择两个协同工作的数据模型。
您需要一个 groupBy 过滤器,您(手动编写,或)从 angular-filter 模块获得。只需设置 JSON 并将事件和日期列在一起。这是一个小演示,您可以根据自己的示例进行调整:
var app = angular.module('myApp', ['angular.filter']);
app.controller('myCtrl', function($scope) {
$scope.events = [{
"date": "Sept-1",
"event": "Event 1"
},
{
"date": "Sept-1",
"event": "Event 2"
},
{
"date": "Sept-2",
"event": "Event 3"
},
{
"date": "Sept-2",
"event": "Event 4"
},
{
"date": "Sept-3",
"event": "Event 5"
},
]
});
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.17/angular-filter.min.js"></script>
<body>
<div ng-app="myApp" ng-controller="myCtrl">
<div ng-repeat="(key, value) in events | groupBy: 'date'">
- {{key}}
<div ng-repeat="val in value">
* {{val.event}}
</div>
<br>
</div>
</div>
</body>
</html>
另一种方法是创建一个函数,该函数 returns 仅当日期与前一个日期不同时才为该日期:
$scope.dateIfNew = function(index) {
var event = $scope.events[index];
if (index == 0) return event.date;
var prevEvent = $scope.events[index-1];
if (event.date != prevEvent.date) return event.date;
//else
return "";
};
这只使用一个 ng-repeat
。它避免了嵌套的额外性能开销 ng-repeat
并避免使用第三方库。
演示
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.dateIfNew = function(index) {
var event = $scope.events[index];
if (index == 0) return event.date;
var prevEvent = $scope.events[index-1];
if (event.date != prevEvent.date) return event.date;
//else
return "";
};
$scope.events = [{"date": "Sept-1","event": "Event 1"},
{"date": "Sept-1","event": "Event 2"},
{"date": "Sept-2","event": "Event 3"},
{"date": "Sept-2","event": "Event 4"},
{"date": "Sept-3","event": "Event 5"},
]
});
<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="myApp" ng-controller="myCtrl">
<table>
<tr ng-repeat="item in events">
<td>
<b>{{dateIfNew($index)}}</b>
</td>
<td>{{item.event}}</td>
</tr>
</table>
</body>