앵귤러JS에는 다양한 뷰를 지원하고, 입력되는 주소에 따라 이 주소를 인지해서 다른 페이지를 보여주는(!!!) 것이 가능하다.
스프링에서 Dispatcher Servlet이 존재하고 이 디스패쳐 서블릿이 모든 입력을 다 받아 주소에 따라 적절한 컨트롤러 선택해주는 것처럼 앵귤러JS에서도 선택되는 주소에 따라 적절한 뷰를 선택해서 뿌려주는 것이 가능하다.
앞서 활용했던 예제들에 약간의 수정을 가해보자.
index.html 파일
<html ng-app="basePoint">
<!--
원래는 ng-app에 특별한 이름을 설정을 하지 않았지만,
이제 반드시 ng-app에 이름을 설정해야 한다.
-->
<head>
<meta charset="utf-8">
<title>Multiple Views Test</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">
/*
* [경로 설정]
*
*/
//경로(주소)에 따라 다른 뷰를 보여주도록 설정한다.
//모듈의 첫번째 파라메터에는 ng-app의 이름을 설정하고,
//$routeProvider를 가져와서 설정을 한다.
angular.module('basePoint', []).config(['$routeProvider',
function($routeProvider)
{
$routeProvider.
when('/phones', //경로명
{
templateUrl: 'partials/phone-list.html', //해당 경로일 때 페이지
controller: PhoneListController //해당 경로일 때 사용할 컨트롤러
}).
when('/phones/:phoneId', //경로명
{
templateUrl: 'partials/phone-detail.html', //해당 경로일 때 페이지
controller: PhoneDetailController //해당 경로일 때 사용할 컨트롤러
}).
otherwise(
{
redirectTo: '/phones' //그 외에의 모든 경로는 여기로 이동
});
}]);
/*
* [컨트롤러]
*
*/
//폰 세부 정보를 보여주는 컨트롤러
function PhoneDetailController($scope, $routeParams)
{
$scope.phoneId = $routeParams.phoneId;
}
//폰 리스트를 보여주는 컨트롤러
function PhoneListController($scope, $http)
{
//jQuery의 ajax 통신과 거의 유사하다.
$http.get('sample.json').success(
function(data)
{
$scope.phones = data;
});
//기본값을 미리 번호로 정해주었다.
//기본값을 정하지 않아도 되지만, 그럴경우 선언된 순서대로 표시된다.
$scope.orderProperty = "no";
//이렇게 선언된 배열 형태의 데이터 모델은 후에 NG-REPEAT에 의해 사용된다.
}
</script>
</head>
<body>
<!-- 앵귤러 뷰 -->
<div ng-view>
</div>
</body>
</html>
어플리케이션의 경로들을 설정하기 위해, 우리는 어플리케이션의 모듈 하나를 생성해야 한다.
우리는 이 모듈을 phonecatApp 혹은 다른 이름으로 부르고 config API를 사용해서 $routeProvider를 호출한다.
이 루트 프로바이더는 우리 config 함수에 주입되게 되고, $routeProvider.when API를 사용해서 경로를 정의하게 된다.
폰 목록 뷰는 URL이 /phones 일때 보여지게 될 것이다. 이 뷰를 구성하기 위해 앵귤러는 phone-list.html 템플릿과 PhoneListController를 사용할 것이다.
폰 세부 뷰는 /phone/:phoneId 와 같을 때 보여지게 될 것이다. :phoneId는 일종의 URL의 변수 부분이라고 볼 수 있다. 폰 세부 뷰를 구성하기 위해 앵귤러는 phone-detail.html 템플릿과 phonedetailcontroller를 사용하게 될 것이다.
우리는 phoneListController를 재사용할 것이고 디테일을 위해서는 새로 만들어야 한다.
알아두어야 할 사실은 두번째 경로 선언에서 사용된 :phoneId parameter 인데, :phoneId 부분에 앞서 경로로 설정해둔 이름과 매칭이 되면 해당 이름이 phoneId 변수에 들어가게 될 것이다.
phone-list.html 파일
검색 :
<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">
<img ng-src="{{phone.url}}">
<a href="#/phones/{{phone.id}}">{{phone.name}}</a>
<p>{{phone.snippet}}</p>
</li>
</ul>
<p>
현재 검색 키워드 : {{searchKeyword || '없음'}}<br />
현재 정렬 기준 : {{orderProperty}}
</p>
phone-detail.html 파일
선택한 아이템의 아이디는 {{phoneId}} 입니다 ㅋㅋ
위의 예제를 Plunker 에서 직접 수정해가며 테스트해보는 것을 권장한다.
http://plnkr.co/edit/3GNzllVwEy2AcPqIfH6g?p=preview