2016-04-26 4 views
1

Я использую этот фасетированный поиск https://plnkr.co/edit/wNbRidDCLmwIBWUOz5bz в свой проект, но с 430 элементами, счетчик фильтров очень медленный ... У меня есть запаздывание ввода при использовании поискового запроса.AngularJS, граненый поиск очень медленно

В HTML:

({{ (filteredItems | filter:query | filter:count(group.name, facet)).length }}) 

В контроллере:

$scope.count = function (prop, value) { 
    return function (el) { 
     return el[prop] == value; 
    }; 
}; 

У вас есть альтернатива?

+2

быстрый обходной путь, чтобы избежать задержек входного сигнала и избежать слишком много бесполезного вычисления дребезга модели выжидать в поисковом вводе путем добавления 'нг-модель-параметров =«{DEBOUNCE: 200}»' – Naigel

+0

никаких изменений. Проблема заключается в функции count. – Akawan

+0

Можете ли вы обновить скрипт, чтобы включить все предметы? Ответ в основном мгновенен в том, что вы опубликовали. –

ответ

0

Я развернул вашу скрипку здесь: http://jsfiddle.net/ema7wpse/ и рассмотрел проблемы, упомянутые выше. Я не вижу никаких проблем с производительностью, но твоя оригинальная скрипка работает нормально для меня, поэтому ваш пробег может отличаться.

(function() { 

    angular.module('myApp', []); 

    var uniqueItems = function(data, key) { 
    var result = []; 

    for (var i = 0; i < data.length; i++) { 
     var value = data[i][key]; 

     if (result.indexOf(value) == -1) { 
     result.push(value); 
     } 

    } 
    return result; 
    }; 

    angular.module('myApp').controller("MyCtrl",MyCtrl) 

    function MyCtrl($scope, filterFilter) { 
    $scope.usePants = {}; 
    $scope.useShirts = {}; 
    $scope.useShoes = {}; 

    $scope.players = [{ 
     name: 'Bruce Wayne', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '12' 
    }, { 
     name: 'Wayne Gretzky', 
     shirt: 'XL', 
     pants: '38', 
     shoes: '10' 
    }, { 
     name: 'Michael Jordan', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'Rodman', 
     shirt: 'XSXL', 
     pants: '42', 
     shoes: '11' 
    }, { 
     name: 'Jake Smitz', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '12' 
    }, { 
     name: 'Will Will', 
     shirt: 'XXLL', 
     pants: '42', 
     shoes: '12' 
    }, { 
     name: 'Youasdf Oukls', 
     shirt: 'XL', 
     pants: '38', 
     shoes: '10' 
    }, { 
     name: 'Sam Sneed', 
     shirt: 'XL', 
     pants: '38', 
     shoes: '10' 
    }, { 
     name: 'Bill Waxy', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'Javier Xavior', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'Bill Knight', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'One More', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'Player One', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '11' 
    }, { 
     name: 'Space Cadet', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '12' 
    }, { 
     name: 'Player Two', 
     shirt: 'XXXXL', 
     pants: '42', 
     shoes: '12' 
    } { 
     name: 'Bill Knight', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'One More', 
     shirt: 'M', 
     pants: '32', 
     shoes: '9' 
    }, { 
     name: 'Player One', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '11' 
    }, { 
     name: 'Space Cadet', 
     shirt: 'XXL', 
     pants: '42', 
     shoes: '12' 
    }]; 

    // Watch the pants that are selected 
    $scope.$watch(function() { 
     return { 
     players: $scope.players, 
     usePants: $scope.usePants, 
     useShirts: $scope.useShirts, 
     useShoes: $scope.useShoes 
     } 
    }, function(value) { 
     var selected; 

     $scope.count = function(prop, value) { 
     return function(el) { 
      return el[prop] == value; 
     }; 
     }; 

     $scope.pantsGroup = uniqueItems($scope.players, 'pants'); 
     var filterAfterPants = []; 
     selected = false; 
     for (var j in $scope.players) { 
     var p = $scope.players[j]; 
     for (var i in $scope.usePants) { 
      if ($scope.usePants[i]) { 
      selected = true; 
      if (i == p.pants) { 
       filterAfterPants.push(p); 
       break; 
      } 
      } 
     } 
     } 
     if (!selected) { 
     filterAfterPants = $scope.players; 
     } 

     $scope.shirtsGroup = uniqueItems($scope.players, 'shirt'); 
     var filterAfterShirts = []; 
     selected = false; 
     for (var j in filterAfterPants) { 
     var p = filterAfterPants[j]; 
     for (var i in $scope.useShirts) { 
      if ($scope.useShirts[i]) { 
      selected = true; 
      if (i == p.shirt) { 
       filterAfterShirts.push(p); 
       break; 
      } 
      } 
     } 
     } 
     if (!selected) { 
     filterAfterShirts = filterAfterPants; 
     } 

     $scope.shoesGroup = uniqueItems($scope.players, 'shoes'); 
     var filterAfterShoes = []; 
     selected = false; 
     for (var j in filterAfterShirts) { 
     var p = filterAfterShirts[j]; 
     for (var i in $scope.useShoes) { 
      if ($scope.useShoes[i]) { 
      selected = true; 
      if (i == p.shoes) { 
       filterAfterShoes.push(p); 
       break; 
      } 
      } 
     } 
     } 
     if (!selected) { 
     filterAfterShoes = filterAfterShirts; 
     } 

     $scope.filteredPlayers = filterAfterShoes; 
    }, true); 


    $scope.$watch('filtered', function(newValue) { 
     if (angular.isArray(newValue)) { 
     console.log(newValue.length); 
     } 
    }, true); 
    } 

    angular.module('myApp').filter('count', function() { 
    return function(collection, key) { 
     var out = "test"; 
     for (var i = 0; i < collection.length; i++) { 
     //console.log(collection[i].pants); 
     //var out = myApp.filter('filter')(collection[i].pants, "42", true); 
     } 
     return out; 
    } 
    }); 

    angular.module('myApp').filter('groupBy', 
    function() { 
     return function(collection, key) { 
     if (collection === null) return; 
     return uniqueItems(collection, key); 
     }; 
    }); 

})(); 
+0

Спасибо! Да, я не воспроизвожу ни с помощью jsfiddle :( – Akawan

+0

Хорошо, я могу воспроизвести. Мои данные имеют гораздо больше свойств. 8 точно – Akawan

+0

Я добавил console.log (prop, value) к функции count, и она вызывается дважды для каждого элемента всякий раз, когда изменяется значение поиска. Я не совсем уверен, как устранить это, но, очевидно, это поможет. –

Смежные вопросы