toggle menu

[AngularJS] 정렬(orderBy)

2012. 10. 30. 11:09 AngularJS
정렬 역시도 앵귤러JS에서는 매우 쉽게 구현할 수 있다.
orderBy 라는 attribute를 제공해주기 때문에 필터에서와 마찬가지로 쉽게 정렬이 가능하다.

Plunker 링크를 통해 직접 소스를 수정해가며 테스트해볼 수도 있다.

Plunker
http://plnkr.co/edit/8xh6Xtu3YK6zvfdfdxJt

<html ng-app ng-controller="PhoneListController">
<!--
하위 모든 요소는 모두 앵귤러 어플리케이션으로 다뤄진다.
-->


<head>
	<meta charset="utf-8">
	<title>Google Phone Gallery</title>
	
	<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js">
	</script>
	<!--
	이 태그는 당연하게도 앵귤러js를 로드하고, 더불어 HTML페이지가 모두 로드된 후에
	브라우저에 의해 실행되는 콜백을 등록한다.
	-->
	
	<script type="text/javascript" charset="utf-8">
		
		/*
		 * BODY 태그 안에 ng-controller 에서 할당해준 컨트롤러의 이름과 동일한
		 * 자바스크립트 함수가 자동으로 매칭된다.
		 * ng-controller에서 호출할 때는 scope 파라메터를 따로 넣지 않았지만,
		 * 실제 컨트롤러 함수에서는 아래와 같이 $scope 를 파라메터로 받는다.
		 */
		function PhoneListController($scope)
		{
			//$scope는 지금까지 느낄 때 jQuery에서 $에 해당하는 전역 객체로 느껴진다.
			//어느 곳에서도 접근할 수 있도록 설정해주는 역할을 한다고 보인다.
			$scope.phones =
			[
     			{
     				"no" : 0,
     				"name": "Nexus S",
					"snippet": "Fast just got faster with Nexus S."
				},
				{
					"no" : 1,
					"name": "Motorola XOOM™ with Wi-Fi",
					"snippet": "The Next, Next Generation tablet."
				},
				{
					"no" : 2,
					"name": "MOTOROLA XOOM™",
      				"snippet": "The Next, Next Generation tablet."
      			}
  			];
  			
  			//기본값을 미리 번호로 정해주었다.
  			//기본값을 정하지 않아도 되지만, 그럴경우 선언된 순서대로 표시된다.
			$scope.orderProperty = "no";
  			
  			//이렇게 선언된 배열 형태의 데이터 모델은 후에 NG-REPEAT에 의해 사용된다.
		}
		
	</script>
	
	
</head>
<body>
	
	검색 : 
	<input type="text" ng-model="searchKeyword"/>
	<!--
	searchKeyword 라는 이름의 앵귤러 모델을 선언해주었다.
	여기에 입력된 내용은 searchKeyword 라는 모델에 자동으로 들어간다.	
	-->
	
	정렬 : 
	<select ng-model="orderProperty">
		<option value="name" selected>이름</option>
		<option value="snippet">설명</option>
		<option value="no">번호</option>
	</select>
	<!--
	orderProperty 라는 임의의 이름으로 정렬 순서를 정해줄 앵귤러 모델을 선언해 주었다.	
	-->
	
	
	<ul>
		<li ng-repeat="phone in phones | filter:searchKeyword | orderBy:orderProperty">
			번호 : {{phone.no}}<br />
			이름 : {{phone.name}}<br />
			설명 : {{phone.snippet}}
		</li>
		
		<!--
		이번에는 orderBy 라는 항목이 추가되었다.
		filter 함수가 매칭되는 내용을 찾는 거라면,
		orderBy는 value에 할당된 값과 일치하는 객체의 요소명를 기준으로 정렬한다.
		-->
		
	</ul>
</body>
</html>


정렬 기능 구현 원리




소스에 충분한 설명을 해둔 것과 같이 정렬은 매우 단순하게 처리할 수 있다.
단지 orderBy에 적절한 이름을 넣어주면 모델에 영향을 주고 영향을 받은 모델에 의해 뷰도 업데이트된다.





AngularJS 관련 포스팅 더보기