<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<style>
#customer-table a{display: block;padding: 5px; background: lightblue;text-decoration: none;}
</style>
</head>
<body>
<div ng-app="MyApp">
<div id="customer-table" ng-controller="MyCtrl as vm">
{{vm.data}}
<table class="table">
<thead>
<tr>
<th class="col-xs-6"><a ng-click="vm.sort('name')" href="#">Name
<span ng-show="vm.predicate == 'name'" class="pull-right">
<span ng-show="!vm.reverse" class="glyphicon glyphicon-chevron-up"></span>
<span ng-show="vm.reverse" class="glyphicon glyphicon-chevron-down"></span>
</span>
</a>
<input type="text" class="form-control" ng-model="fName"/>
</th>
<th class="col-xs-6">
<a ng-click="vm.sort('age')" href="#">Age
<span ng-show="vm.predicate == 'age'"class="pull-right">
<span ng-show="!vm.reverse" class="glyphicon glyphicon-chevron-up"></span>
<span ng-show="vm.reverse" class="glyphicon glyphicon-chevron-down"></span>
</span>
</a>
<input type="text" class="form-control" ng-model="fAge"/>
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="obj in vm.data | filter:{name:fName} | filter:{age:fAge}">
<td><input type="text" ng-model="obj.name"></td>
<td><input type="text" ng-model="obj.age"></td>
</tr>
</tbody>
</table>
{{vm.predicate}} {{vm.reverse}}
</div>
</div>
<script>
(function (module) {
function myCtrl($scope, $filter) {
var vm = this;
vm.data = [
{ name: "Bernard", age: 19 },
{ name: "Bogart", age: 17 },
{ name: "Trevor", age: 12 },
{ name: "Dunn", age: 9 },
{ name: "Preston", age: 23 },
];
vm.sort = function (predicate) {
vm.predicate = predicate;
vm.reverse = (vm.predicate == predicate) ? !vm.reverse : false;
vm.data = $filter('orderBy')(vm.data, predicate, vm.reverse); //magic
}
vm.filters = {};
vm.headerFilter = ['name', 'filter'];
}
module.controller("MyCtrl", ['$scope', '$filter', myCtrl]);
})(angular.module('MyApp', []));
</script>
</body>
Edit - Sort - Filter Table