<!DOCTYPE html>
<html>

<head>
  <script data-require="jquery@1.10.1" data-semver="1.10.1" src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
  <link rel="stylesheet" href="//cdn.datatables.net/1.10.1/css/jquery.dataTables.css" />
  <link data-require="bootstrap-css@*" data-semver="3.0.0-rc1" rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" />
  <script data-require="bootstrap@3.0.0-rc1" data-semver="3.0.0-rc1" src="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js"></script>
    
</head>

<body ng-app="datatablesSampleApp">
    <div ng-controller="sampleCtrl">
        <table datatable="ng" dt-options="dtOptions" dt-column-defs="dtColumns" dt-instance="dtInstance">
            <thead>
              <tr>
                <th>
                  Icon
                  <i ng-click="showFavoriteOnly(); $event.stopPropagation();" class="fa" ng-class="{'fa-star-o': !showFavorites, 'fa-star': showFavorites,}"></i>
                </th>
                <th>Prop1</th>
                <th>Prop2</th>
              </tr>
            </thead>
            <tbody>
                <tr ng-repeat="item in items">
                    <td><i ng-class="item.icon"></i></td>
                    <td>{{item.prop1}}</td>
                    <td>{{item.prop2}}</td>
                </tr>
            </tbody>
        </table>
    </div>
    <script src="//cdn.datatables.net/1.10.1/js/jquery.dataTables.js"></script>
    <script type="text/javascript" data-require="angular.js@1.2.15" data-semver="1.2.15" src="http://code.angularjs.org/1.2.15/angular.js"></script>
    <script type="text/javascript" src="https://rawgithub.com/l-lin/angular-datatables/dev/dist/angular-datatables.min.js"></script>
    <script src="script.js"></script>
</body>

</html>
(function(angular) {
    'use strict';
    angular.module('datatablesSampleApp', ['datatables']).
    controller('sampleCtrl', function($scope, DTOptionsBuilder, DTColumnDefBuilder) {
       $scope.showFavorites = false;
       
       $scope.showFavoriteOnly = function () {
         $scope.showFavorites = !$scope.showFavorites;
        };
       
       $scope.dtColumns = [
           DTColumnDefBuilder.newColumnDef(0).withOption('orderDataType', 'fa-classes'),
           DTColumnDefBuilder.newColumnDef(1),
           DTColumnDefBuilder.newColumnDef(2)
       ];  
       
       $scope.items = [{icon: "fa fa-star", prop1: "foo", prop2: "bar"},
       {icon: "fa fa-star-o", prop1: "know", prop2: "def"},
       {icon: "fa fa-star", prop1: "not know", prop2: "mar"}];

       $scope.dtOptions = DTOptionsBuilder.newOptions()
          .withPaginationType('full_numbers');
       
       $scope.dtInstance = {}
       
       $scope.$watch("showFavorites", function (newVal, oldVal) {
                if (oldVal != newVal && oldVal !== undefined) {
                    if (newVal) {
                        $.fn.dataTable.ext.search.push(
                            function (settings, searchData, index, rowData, counter) {
                                return $(rowData[0]).hasClass('fa-star');
                            }
                        );
                        $scope.dtInstance.DataTable.draw();
                    } else {
                        $.fn.dataTable.ext.search.pop();
                        $scope.dtInstance.DataTable.draw();
                    }
                }
            });
       
       $.fn.dataTable.ext.order['fa-classes'] = function (settings, col) {
                return this.api().column(col, {order: 'index'}).nodes().map(function (td, i) {
                    return $('i', td).hasClass('fa-star-o') ? '1' : '0';
                })
            };
       
    });
})(angular);