본문 바로가기
Programming/JavaScript

[Angular] paging 만들기

by NAMP 2015. 9. 22.
[Angular] paging 만들기

먼저 3가지 값을 사용합니다. 

<c:out value="${params.pageIndex}" />
<c:out value="${params.pageUnit}" />
<c:out value="${params.recordCount} />

각각은, 페이지 번호, 한 페이지에서 보여지는 수, 전체 아이템의 수 입니다. 

이를 통해서, 화면상에 표출할 페이지를 결정합니다. 

DIV 태그를 작성합니다. 

<div class="pagination" ng-cloak ng-app="ngAppPage" ng-controller="pagingController">
          <button type="button" class="btn-prev" ng-click="fnLinkPrev()">이전</button>
          <ul class="clearFix">                        
               <li ng-repeat="page in setPage(<c:out value="${params.pageIndex}" />
                                                       ,<c:out value="${params.pageUnit}" />
                                                       ,<c:out value="${params.recordCount}" />)"                                                                 
                    ng-class="{current : page == <c:out value="${params.pageIndex}" />}">
               <button type="button" ng-click="fnLink(page)">{{page}}</button></li>                        
          </ul>
          <button type="button" class="btn-next" ng-click="fnLinkNext()">다음</button>
     </div><!-- .pagination -->

화면의 깜빡임을 안보이게 하기 위해서, ng-cloak 을 사용합니다. 

ng-app, ng-controller 를 모두 설정합니다. 

angular 모듈을 생성합니다. 

angular.module('ngAppPage',[]).controller('pagingController', function($scope, $window){
});

ng-repeat 에서 함수를 호출합니다. 

선택한 페이지에 클래스를 설정합니다. 

<li ng-repeat="page in setPage(<c:out value="${params.pageIndex}" />
                                                       ,<c:out value="${params.pageUnit}" />
                                                       ,<c:out value="${params.recordCount}" />)"                                                                 
                    ng-class="{current : page == <c:out value="${params.pageIndex}" />}">

angular 모듈에, setPage 함수를 생성합니다. 

$scope.setPage = function(pageIndex, pageUnit, recordCount, func){
               $scope.pageIndex = pageIndex;
               $scope.pageUnit = pageUnit;
               $scope.recordCount = recordCount;
               $scope.pageMax = Math.floor((recordCount-1) / pageUnit + 1);
              
               $scope.pageShow = 11;         
               $scope.pageShowHalf = Math.floor($scope.pageShow/2);
               $scope.pages = [];
              
               $scope.startPage = pageIndex - $scope.pageShowHalf;
               if ($scope.startPage < 1) $scope.startPage = 1;
              
               $scope.endPage = $scope.startPage + $scope.pageShow;
               if ($scope.endPage > $scope.pageMax) $scope.endPage = $scope.pageMax;
              
               for (var i = $scope.startPage; i <= $scope.endPage; i++){
                    $scope.pages.push(i);
               };
              
               return $scope.pages;
          };

각각의 파라미터 값을 받은 이후에,

화면상에 보여질 페이지를 결정합니다. 

 $scope.pageShow 는 화면상에 보여지는 페이지의 최대 수 이며, 

$scope.pages = []; 는 화면상에 보여질 페이지의 배열입니다. 

반환된 배열 값으로 화면상에 표출하며, 

버튼 클릭시에, fnLink 함수가 호출 되도록 합니다. 

<button type="button" ng-click="fnLink(page)">{{page}}</button></li>

fnLink 함수를 생성합니다.

$scope.fnLink = function(pageIndex){
               if (pageIndex < 1) pageIndex = 1;
               if (pageIndex > $scope.pageMax) pageIndex = $scope.pageMax;
              
               $window.fnLink(pageIndex);
          };

실질적인 구현은 Javascript로 하기 위해서, $window 변수를 사용합니다. 

그리고, 함수명은 fnLink로 고정하였습니다.

이전, 다음 버튼을 생성합니다. 

<button type="button" class="btn-prev" ng-click="fnLinkPrev()">이전</button>
<button type="button" class="btn-next" ng-click="fnLinkNext()">다음</button>

만약, 맨처음, 맨마지막을 추가한다면, 

각각의 값에, {{startPage}} {{endPage}} 값을 입력하여, fnLink 함수를 호출하도록 생성하면 됩니다. 


각각의 클릭 이벤트 함수를 생성합니다. 

$scope.fnLinkPrev = function(){
               $scope.fnLink($scope.pageIndex - 1);         
          };
         
 $scope.fnLinkNext = function(){
               $scope.fnLink($scope.pageIndex + 1);
          };

기존에 생성한 fnLink 함수를 호출하고, 파라미터 값만 변경합니다. 

실질적인 동작인 fnLink 함수를 구현합니다. 

function fnLink(pageIndex) {

     document.frm.pageIndex.value = pageIndex;
     document.frm.action = "<c:url value='/dev/list.do' />";
     document.frm.submit();
}     

## 전체 소스 ##

<head>
     <script type="text/javascript">
    
     // paging by angular
     angular.module('ngAppPage',[]).controller('pagingController', function($scope, $window){

          $scope.setPage = function(pageIndex, pageUnit, recordCount, func){
               $scope.pageIndex = pageIndex;
               $scope.pageUnit = pageUnit;
               $scope.recordCount = recordCount;
               $scope.pageMax = Math.floor((recordCount-1) / pageUnit + 1);
              
               $scope.pageShow = 11;         
               $scope.pageShowHalf = Math.floor($scope.pageShow/2);
               $scope.pages = [];
              
               $scope.startPage = pageIndex - $scope.pageShowHalf;
               if ($scope.startPage < 1) $scope.startPage = 1;
              
               $scope.endPage = $scope.startPage + $scope.pageShow;
               if ($scope.endPage > $scope.pageMax) $scope.endPage = $scope.pageMax;
              
               for (var i = $scope.startPage; i <= $scope.endPage; i++){
                    $scope.pages.push(i);
               };
              
               return $scope.pages;
          };
         
          $scope.fnLink = function(pageIndex){
               if (pageIndex < 1) pageIndex = 1;
               if (pageIndex > $scope.pageMax) pageIndex = $scope.pageMax;
              
               $window.fnLink(pageIndex);
          };
         
          $scope.fnLinkPrev = function(){
               $scope.fnLink($scope.pageIndex - 1);         
          };
         
          $scope.fnLinkNext = function(){
               $scope.fnLink($scope.pageIndex + 1);
          };
     });
    
    
     </script>
</head>
<body>
     <div class="pagination" ng-cloak ng-app="ngAppPage" ng-controller="pagingController">
          <button type="button" class="btn-prev" ng-click="fnLinkPrev()">이전</button>
          <ul class="clearFix">                        
               <li ng-repeat="page in setPage(<c:out value="${params.pageIndex}" />
                                                       ,<c:out value="${params.pageUnit}" />
                                                       ,<c:out value="${params.recordCount}" />)"                                                                 
                    ng-class="{current : page == <c:out value="${params.pageIndex}" />}">
               <button type="button" ng-click="fnLink(page)">{{page}}</button></li>                        
          </ul>
          <button type="button" class="btn-next" ng-click="fnLinkNext()">다음</button>
     </div><!-- .pagination -->
</body>
</html>






'Programming > JavaScript' 카테고리의 다른 글

[ionic] framework  (0) 2015.09.26
[Angular] 3단 배열 테이블 만들기  (0) 2015.09.22
[jQuery] Datepicker  (0) 2015.09.22
[javascript] YUIDOC  (0) 2014.12.18
[Dojo] Hello Dojo!  (0) 2014.12.06

댓글