당신은 Array#reduce
, ng-repeat-start
및 ng-repeat-end
사용 그룹에 의해 배열을 사용할 수있다 :
HTML을 (I는 설명을 목적으로 여기 부트 스트랩의 패널을 사용) :
<body ng-app="MyApp">
<div ng-controller="MyCtrl">
<div class="panel panel-default">
<div class="panel-heading" ng-repeat-start="(group, values) in groupedData">
{{ group }}
</div>
<div class="panel-body" ng-repeat-end ng-repeat="value in values">
{{ value.name }}
</div>
</div>
</div>
</body>
자바 스크립트 :
angular.module('MyApp', []).controller('MyCtrl', ['$scope', function($scope){
var rawData = [{
"name": "A1",
"group": "A" // For simplicity, my grouping criteria is called 'group'
},{
"name": "A2",
"group": "A"
},{
"name": "A3",
"group": "A"
},{
"name": "B1",
"group": "B"
},{
"name": "C1",
"group": "C"
},{
"name": "C2",
"group": "C"
}];
// Perform a Group-by on the rawData: {"A": [{...}], ...} using Array#reduce
$scope.groupedData = rawData.reduce(function(accumulator, value){
if(!accumulator[value.group]) accumulator[value.group] = [];
accumulator[value.group].push(value);
return accumulator;
}, {});
}]);
JSBin 예 : http://jsbin.com/gigerilope/edit?html,js,output
편집 :
가 어떤 버튼 클릭시이 그룹을 트리거하려면 우리가 먼저 버튼을 추가하고 ng-click
핸들러 바인딩 : 확장 된 질문에 대답 컨트롤러에
<button class="btn btn-default" ng-click="performGrouping()">
Perform Grouping
</button>
을 대신 할당
$scope.groupedData = null;
$scope.performGrouping = function() {
$scope.groupedData = rawData.reduce(function(accumulator, value) {
if (!accumulator[value.group]) accumulator[value.group] = [];
accumulator[value.group].push(value);
return accumulator;
}, {});
};
N : 그룹화 된 데이터를 즉시, 우리는 ng-click
에서 호출 될 수 처리 기능에 포장 오우 우리는 버튼을 클릭하기 전에 "어떤 그룹화"를 표시하지 싶어, 그래서 우리는 이야기를 알려줄 수있는 <div>
패널을 추가, 모두 패널을 볼 수있다
<div class="panel panel-default">
<div class="panel-body">
No Grouping Yet
</div>
</div>
이 시점을 - 우리가 하나를 표시해야 시간.
결과 패널 :
<div class="panel panel-default" ng-show="groupedData">
"아니오 그룹화"패널 : 진실 검사 $scope.groupedData
좋은 생각이 될 것
<div class="panel panel-default" ng-hide="groupedData">
그러나 rawData
는 하늘의 배열, groupedData
인 경우 빈 오브젝트 {}
이되며, 이는 true
으로 해석됩니다. groupedData
에있는 키 수를 확인하기 위해 키 확인을 할 수 있습니다.
$scope.keys = function(obj) {
return obj && Object.keys(obj);
};
그리고 다시 템플릿 HTML을 업데이트 : 이렇게하려면, 우리는 열쇠를 반환하는 함수를 추가해야
결과 패널 :
<div class="panel panel-default" ng-show="keys(groupedData).length">
"아니오 그룹화"패널 :
<div class="panel panel-default" ng-hide="keys(groupedData).length">
그리고 우리는 지금 좋을 것입니다.
JS 답답해 : https://jsfiddle.net/kazenorin/Ler7p6fe/
나는 이것을 당신의 예제와 함께 테스트 해 보았는데, 훌륭하게 작동합니다. 요청에 따라 호출되는 메서드에이 기능을 첨부하는 방법을 설명 할 수 있습니까? 예를 들어, '그룹화 안 함'을 표시하면 시작하고 그룹화는 요청한 경우에만 표시됩니다 (예 : 버튼 클릭). – Riples
확장 질문에 해결책 추가 – kazenorin
이것은 아주 좋습니다! 자세한 답변을 드릴 시간을 주셔서 감사합니다. 나의 각성 기술은 아직 진행 중이며, 내 지식을 구축하는 데 도움이되는 답변입니다. 다시 한 번 감사드립니다! – Riples