Как отобразить что-то, когда фильтрация медленная, используя AngularJS

В угловом у меня есть таблица и окно поиска, где пользователь может напечатать, а угловой будет искать среди данных и отображать таблицу. Проблема в том, что у меня достаточно данных для замедления фильтрации, в этом случае я хотел бы отобразить счетчик:

Образец похож на мой HTML:

<body ng-controller="MainCtrl">

Search: <input ng-model="searchText">
<table id="searchTextResults">
  <tr><th>Name</th><th>Phone</th><th>Address</th><th>City</th><th>Zip</th><th>Country</th></tr>
  <tr ng-repeat="friend in friends | filter:searchText">
    <td>{{friend.name}}</td>
    <td>{{friend.phone}}</td>
    <td>{{friend.address}}</td>
    <td>{{friend.city}}</td>
    <td>{{friend.zip}}</td>
    <td>{{friend.country}}</td>
  </tr>
</table>
<div class='myspinner' > <!-- display only if filtering is occurring -->

Вопрос в том, как я могу отображать счетчик каждый раз, когда происходит фильтрация?

CSS для вращающегося div:

.myspinner {
       position: absolute;
       left: 45%;
       top: 45%;
       height:50px;
       width:50px;
       margin:0px auto;
       position: absolute;
       -webkit-animation: rotation .6s infinite linear;
       -moz-animation: rotation .6s infinite linear;
       -o-animation: rotation .6s infinite linear;
       animation: rotation .6s infinite linear;
       border-left:6px solid rgba(0,170,240,.25);
       border-left: 6px solid rgba(0,170,240,.25);
       border-right: 6px solid rgba(0,170,240,.25);
       border-bottom: 6px solid rgba(0,170,240,.25);
       border-top: 6px solid rgba(0,170,240,.6);
       border-radius:100%;
    }

ссылка на plunkr: http://plnkr.co/edit/NcbPPcxL1rk0ZBKpbqZG?p=preview

2 ответа

Не уверен, что это работает, но вы можете попробовать.

Добавить новый фильтр

 app.filter('ngRepeatFinish', function($timeout){
return function(data){
    var me = this;
    var flagProperty = '__finishedRendering__';
    if(!data[flagProperty]){
        Object.defineProperty(
            data, 
            flagProperty, 
            {enumerable:false, configurable:true, writable: false, value:{}});
        $timeout(function(){
                delete data[flagProperty];                        
                me.$emit('ngRepeatFinished');
            },0,false);                
    }
    return data;
};
})

Новая функция в вашем контроллере

$scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) {
  $scope.showSpinner = false;
  $scope.$apply();
});

И ваш HTML

<tr ng-repeat="friend in (friends | ngRepeatFinish)"

Следите за скобками

Вам также может понадобиться создать собственную директиву для фильтрации информации, ng-фильтр по умолчанию работает медленно, потому что он проверяет все поля ваших объектов.

Вы можете создать пользовательскую директиву ng для фильтрации по вашим конкретным полям, посмотрите

Другие вопросы по тегам