2016-06-02 4 views
0

angular.js를 사용하는 테이블에 대한 사용자 지정 정렬을 시도하고 있습니다. 내 각 모듈은 다음과 같습니다각 날짜 맞춤 정렬 함수

angular.module('app', ['ui.bootstrap', 'ngAnimate']) 
angular.factory('sortable', ['$filter', '$rootScope', function($filter, $rootScope){ 

return function (scope, data, itemsPerPage, initSortingOrder) { 

scope.sortingOrder = initSortingOrder; 
scope.reverse = false; 
scope.filteredItems = []; 
scope.groupedItems = []; 
scope.itemsPerPage = itemsPerPage; 
scope.pagedItems = []; 
scope.currentPage = 1; 
scope.items = data; 
scope.maxSize = 5; 

var searchMatch = function (haystack, needle) { 
     if (!needle) { 
      return true; 
     } 
     return haystack.toLowerCase().indexOf(needle.toLowerCase()) !== -1; 
    }; 


    // init the filtered items 
    scope.search = function() { 

     scope.filteredItems = $filter('filter')(scope.items, $rootScope.query); 

     // take care of the sorting order 
    if (scope.sortingOrder !== '') { 
     scope.filteredItems = $filter('orderBy')(scope.filteredItems, scope.sortingOrder, scope.reverse); 
    } 

     scope.currentPage = 1; 

     // now group by pages 
     scope.groupToPages(); 

     // reset the total items for the pagination buttons 
     scope.totalItems = scope.filteredItems.length; 
    }; 


    // calculate page in place 
    scope.groupToPages = function() { 
     scope.pagedItems = []; 

     for (var i = 0; i < scope.filteredItems.length; i++) { 
      if (i % scope.itemsPerPage === 0) { 
       scope.pagedItems[Math.floor(i/scope.itemsPerPage)] = [ scope.filteredItems[i] ]; 
      } else { 
       scope.pagedItems[Math.floor(i/scope.itemsPerPage)].push(scope.filteredItems[i]); 
      } 
    } 

    }; 


    scope.range = function (start, end) { 
     var ret = []; 
     if (!end) { 
      end = start; 
      start = 0; 
     } 
     for (var i = start; i < end; i++) { 
      ret.push(i); 
     } 
     return ret; 
    }; 


    // functions have been described process the data for display 
    scope.search(); 


    // change sorting order 
    scope.sort_by = function(newSortingOrder) { 
     if (scope.sortingOrder == newSortingOrder) 
      scope.reverse = !scope.reverse; 

     scope.sortingOrder = newSortingOrder; 

     // call search again to make sort affect whole query 
     scope.search(); 
    }; 

    scope.sort_by(initSortingOrder); 
    scope.totalItems = scope.filteredItems.length; 
    } 

}]) 

    .controller('main', [ '$scope', '$rootScope', 'sortable', function($scope, $rootScope, sortable) { 


$rootScope.query = ''; 

$scope.gridToggle = true; 

$scope.onQueryChange = function(val){ 
    $rootScope.query = val; 
    $scope.search(); 
}; 

var items = [ 
    { 'icon' : 'm-desktop', 'name' : 'Jerry\'s Blog',   'date' : '06/03/2016', 'user' : { 'name' : 'Jerry', 'color' : '#4677A7'} }, 
    { 'icon' : 'm-form', 'name' : 'Ape\'s Capture Form', 'date' : '01/06/2013', 'user' : { 'name' : 'Ape',  'color' : '#09ABC5'} }, 
    { 'icon' : 'm-phone', 'name' : 'Some Mobile Site',  'date' : '05/06/2015', 'user' : { 'name' : 'Someone', 'color' : '#456183'} }, 
    { 'icon' : 'm-bell', 'name' : 'Fish\'s Wordpress Site', 'date' : '04/06/2013', 'user' : { 'name' : 'Fish', 'color' : '#1CB7BB'} }, 
    { 'icon' : 'm-group', 'name' : 'Kitty Kat Kapture Form', 'date' : '05/06/2015', 'user' : { 'name' : 'Kitty', 'color' : '#1D9D9D'} } 
]; 

sortable($scope, items, 6, 'updated_at'); 

    }]); 

소팅 기능은 문자열을 잘 작동합니다. 문자열 날짜를 각도 날짜 객체로 변환 한 다음 정렬하는 방법은 무엇입니까?

이 전체 HTML이다

<body ng-app="app" ng-controller="main"> 
    <header> 

    <h1>Objects <span>({{ items.length }})</span></h1> 
</header> 

<div class="ctrls"> 

    <div class="filter"> 
    <span class="m m-search"></span> 
    <input type="text" ng-model="searchies" ng-change="onQueryChange(searchies)" class="form-control" placeholder="Filter"> 
    </div> 

    <div class="grid-toggle"> 
    <a ng-click="gridToggle = !gridToggle" ng-class="{ 'active' : gridToggle }"> 
     <span class="m m-squares"></span> 
     <span class="m m-form"></span> 
    </a> 
    </div> 

</div> 


<div class="container"> 

    <ul class="grid" ng-class="{ 'grid-list' : gridToggle, 'grid-thumb' : !gridToggle }"> 
    <li class="grid-head"> 
     <ul> 
     <li style="width:40%"><a ng-click="sort_by('name')">Name</a></li> 
     <li style="width:30%"><a ng-click="sort_by('user.name')">User</a></li> 
      <li style="width:15%"><a ng-click="sort_by('date')">Date</a></li> 
     <li style="width:15%"></li> 
     </ul> 
    </li> 
    <li class="grid-body animate-repeat" ng-repeat="item in pagedItems[currentPage - 1] | orderBy:sortingOrder:reverse" ng-class="{'last':$last}"> 

     <ul> 
     <li> 

      <span class="grid-icon m" ng-class="item.icon"></span> 
      <span class="grid-title"><a href="#">{{ item.name }}</a></span> 
     </li> 

     <li> 
      <span class="grid-user"> 
      <span class="grid-usericon" ng-style="{ 'background' : item.user.color }">{{ item.user.name }}</span> 
      <span class="grid-username">Updated by {{ item.user.name }}</span> 
      </span> 
     </li> 

     <li> 
      <span class="grid-date">{{ item.date }}</span> 
     </li> 

     <li> 
      <span class="grid-options"><a href="#"><span class="m m-ellipsis"></span></a></span> 
     </li> 
     </ul> 

    </li> 

    <li class="clear-fix"></li> 

    <li class="pagination"> 
     <pager total-items="totalItems" items-per-page="itemsPerPage" ng-model="currentPage" max-size="maxSize" ng-change="pageChanged()"></pager> 
     <p ng-if="itemsPerPage * currentPage < totalItems"> 
     Showing {{ itemsPerPage * currentPage - itemsPerPage + 1 }} - {{ itemsPerPage * currentPage }} of {{ totalItems }} total items 
     </p> 
     <p ng-if="itemsPerPage * currentPage >= totalItems"> 
     Showing {{ itemsPerPage * currentPage - itemsPerPage + 1 }} - {{ totalItems }} of {{ totalItems }} total items 
     </p> 
    </li> 
    </ul> 

</div> 

답변

1

pagedItems의 항목이 무엇인지 완전히 명확하지 않지만 날짜를 나타내는 문자열 인 경우 개체로 변환 할 수 있습니다 (Date.parse(string)). 당신이 Date 객체로, 당신은 그들에게 여러 가지 방법으로 정렬 할 수 있습니다 그들을 일단 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

:

여기에서 자세한 내용을 참조하십시오. 여기에 당신을 도울 답이 있습니다 https://stackoverflow.com/a/10124053/5780097

+0

* Date.parse * (또는 문자열을 파싱하려면 * Date * 생성자는 사용하지 않는 것이 좋습니다). 내장 구문 분석은 거의 전적으로 구현에 의존하며 브라우저간에 매우 신뢰할 수 없습니다. 날짜 문자열은 수동으로 파싱해야하며 라이브러리는 도움이 될 수 있지만 대개는 필요하지 않습니다. – RobG