2016-04-26 21 views
1

私はこのファセット検索をhttps://plnkr.co/edit/wNbRidDCLmwIBWUOz5bz私のプロジェクトに使用していますが、430個の項目があり、フィルタカウンタが非常に遅いです... HTMLでAngularJS、ファセット検索が非常にゆっくりです

:コントローラで

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

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

あなたは選択肢を持っていますか?

+2

高速な問題を回避するには、入力遅延を回避し、 'NG-モデル・オプション=「{デバウンス:200}」を追加することによって、あまり役に立たない計算は、検索入力にモデル結着をデバウンスさを避けるために、' – Naigel

+0

変更なし。問題はカウント関数です。 – Akawan

+0

すべてのアイテムを含めるようにフィディルドを更新できますか?レスポンスは基本的にあなたが投稿したもので瞬間的です。 –

答えて

0

私はあなたのフィドルをここにフォークしました:http://jsfiddle.net/ema7wpse/と上記の問題を解決しました。私はそれでパフォーマンスの問題は見ていないが、あなたのオリジナルのフィドルは私のためにOKを行ったので、あなたの走行距離は異なるかもしれません。

(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を追加しましたカウント関数には、検索値が変更されるたびにアイテムごとに2回呼び出されています。私はこれを排除する方法は完全にはわかりませんが、明らかに助けになります。 –

関連する問題