Skip to content Skip to sidebar Skip to footer

Sorting Table Columns In Angularjs

The following code for sorting table columns doesn't work. I get an Error message: Error: $injector:unpr Unknown Provider Unknown provider: orderbyFilterProvider <- View: &l

Solution 1:

Here what I have tried

Updated html.

<body ng-controller="testCtrl">

    <tableclass="table table-bordered table-hover"><thead><tr><th><ahref=""ng-click="reverse=!reverse;predicate = 'lname'">Lastname</a></th><th><ahref=""ng-click="reverse=!reverse;predicate = 'fname'">Firstname</a></th><th><ahref=""ng-click="reverse=!reverse;predicate = 'maxAge '">Age</a></th></tr></thead><tbody><trng-repeat="item in nameslist | orderBy:predicate:reverse"><td>{{ item.lname }}</td><td>{{ item.fname }}</td><td>{{ item.maxAge }}</td></tr></tbody></table>
</body>



app.controller("testCtrl",['$scope','$filter',function($scope,$filter){
        $scope.nameslist = [{maxAge :112,fname:'first1' ,MiddleName: 'middle1',lname:'last1'},
      {maxAge :15,fname:'first2' ,MiddleName: 'middle1',lname:'last1'},
      {maxAge :11,fname:'first3' ,MiddleName: 'middle2',lname:'last2'},
      {maxAge :14,fname:'first4' ,MiddleName: 'middle3',lname:'last1'}
      ];

There is no need of custom filter.

Here is the Plunker

Solution 2:

You could use angular's built in orderBy filter, like so for reversing as well:

<tableclass="table table-bordered table-hover"><thead><tr><th><ahref=""ng-click="order('lname')">Lastname</a></th><th><ahref=""ng-click="order('fname')">Firstname</a></th><th><ahref=""ng-click="order('maxAge')">Age</a></th></tr></thead><tbody><trng-repeat="item in (nameslist | orderBy:predicate:reverse)"><td>{{ item.lname }}</td><td>{{ item.fname }}</td><td>{{ item.maxAge }}</td></tr></tbody></table>

And the following order function:

$scope.nameslist = [{maxAge :112,fname:'Amy' ,MiddleName: 'Sue',lname:'Test'},
  {maxAge :15,fname:'Chris' ,MiddleName: 'Deb',lname:'Something'},
  {maxAge :11,fname:'Sue' ,MiddleName: 'Amy',lname:'Abcd'},
  {maxAge :14,fname:'Debby' ,MiddleName: 'Chris',lname:'Try'}
  ];

//sort function//var orderby = $filter('orderby');// initializing the filter // if you don't want a default filter, you could initialize them to empty$scope.predicate = 'lname'; 
$scope.reverse = false;

$scope.order = function (filterBy) {
   // if same filter is clicked again, and its not reverse then reverse// else just apply the filterif ($scope.predicate === filterBy) {
       $scope.reverse = !$scope.reverse;
   } else {
       $scope.reverse = false;
   }
    $scope.predicate = filterBy;
};

The logic behind it is that sending an additional parameter true to the orderBy would reverse it, So we are just using this to reverse.

Also your error could have been because of this line:

<tr ng-repeat="item in filteredItems = (nameslist | orderBy:predicate)">

which should be:

<tr ng-repeat="item in (nameslist | orderBy:predicate:reverse)">

Here is the plunker that works:

http://plnkr.co/edit/JSoyoCkBwknlAggEwU59?p=preview

Post a Comment for "Sorting Table Columns In Angularjs"