필터 함수는 input에 입력된 값과 매칭되는 것으로만 새로운 배열을 생성하게 된다.
ng-repeat은 filter에 의해 생성된 배열을 자동적으로 뷰에 업데이트한다. 이 모든 과정이 개발자에게 투명하다.
필터에 대한 데이터 바인딩의 원리와 순서에 대해 살펴보자.
데이터 바인딩(Data-binding)
데이터 바인딩은 앵귤러JS에서 핵심 기능 중 하나이다. 페이지가 로드되면 앵귤러는 동이란 이름의 input과 데이터 모델을 연결하고 이 둘의 싱크를 유지시킨다.
여기 코드에서는 searchKeyword ng-model에 정한 이름을 가진 input에 사용자가 무언가를 타이핑하면 그 즉시 필터로서 기능할 수 있게 된다. 필터에 의해 데이터 모델이 변화되면, 리피터는 효과적으로 DOM을 업데이트하게 된다.
아래 소스를 직접 테스트해보려면 아래의 Plunker 링크를 클릭해보자.
Plunker
http://plnkr.co/edit/mAbKt50KJ0HyzwFBcBsK
<html ng-app> <!-- 하위 모든 요소는 모두 앵귤러 어플리케이션으로 다뤄진다. --> <head> <meta charset="utf-8"> <title>My HTML File</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 = [ { "name": "Nexus S", "snippet": "Fast just got faster with Nexus S." }, { "name": "Motorola XOOM™ with Wi-Fi", "snippet": "The Next, Next Generation tablet." }, { "name": "MOTOROLA XOOM™", "snippet": "The Next, Next Generation tablet." } ]; $scope.hello = "Hello, World!"; //이렇게 선언된 배열 형태의 데이터 모델은 후에 NG-REPEAT에 의해 사용된다. } </script> </head> <body ng-controller="PhoneListController"> <input type="text" ng-model="searchKeyword"/> <!-- searchKeyword 라는 이름의 앵귤러 모델을 선언해주었다. 여기에 입력된 내용은 searchKeyword 라는 모델에 자동으로 들어간다. --> <ul> <li ng-repeat="phone in phones | filter:searchKeyword"> 이름 : {{phone.name}}<br /> 설명 : {{phone.snippet}} </li> <!-- 비슷한거 같지만, 자세히 살펴보면, filter 가 추가되었다. filter 함수는 ng-repeat에 영향을 주게 된다. 특별히 searchKeyword에 입력된 값에 따라 내용을 필터링해서 보여준다. --> </ul> </body> </html>