使用AngularJS有效地使用过滤,排序和分页

时间:2014-10-02 20:23:31

标签: angularjs

我一直在实现基于不同字段过滤表格的功能,起初看起来相当简单,但现在事情变得越来越复杂,我想确保我有效地利用Angular的摘要周期。

现在,当用户第一次点击视图并且控制器被实例化时,我调用API并从服务器获取数据数组。我将此数据称为dataSet。这是未经过滤的未经过滤的数据。

然后在页面上有两种不同的过滤方式,一个搜索栏(<input>)和一个实际的过滤器菜单,用户可以在其中切换不同的值On / Off并使表格实时更新。起初我认为使用管道将过滤器逻辑放在ng-repeat内部是很简单的,但这不适用于我的分页,因为分页继续反映dataSet而不是<tr ng-repeat="mailbox in model.IndividualMailboxes.filtered | orderBy:model.IndividualMailboxes.ordering.predicate:model.IndividualMailboxes.ordering.reverse | paginate:(model.IndividualMailboxes.currentPage - 1) * model.IndividualMailboxes.resultsPerPage | limitTo:model.IndividualMailboxes.resultsPerPage"> 过滤数据。这导致我的HTML看起来像

filtered

这导致我创建了第二个数组,我称之为dataSet。我基本上将filtered数组过滤到这个新的ng-repeat数组中。然后我的filtered和分页都使用filterFilter(arr, term)集。这也迫使我将实际过滤器放在控制器中,并使用dataSet分两个阶段过滤function filterIndividualMailboxes() { var verifiedList = [], searchList = []; verifiedList = filterFilter($scope.model.IndividualMailboxes.dataSet, { Valid : $scope.model.IndividualMailboxes.showVerified }); searchList = filterFilter(verifiedList, $scope.model.IndividualMailboxes.search); $scope.model.IndividualMailboxes.filtered = searchList; }

dataSet

上述函数只是通过我们的过滤选项过滤filterIndividualMailboxes()(在这种情况下只有1),然后根据用户可以输入的搜索词对其进行过滤和过滤。

这个实现的问题是它似乎不能有效地融入摘要周期,因为每当数据以任何方式改变时我都必须调用$watch()。实现这一目标的最简单方法是只需$scope.$watch('model.IndividualMailboxes', function(){ filterIndividualMailboxes(); }, true); 整个模型就像这样

{{1}}

但我担心这不是非常有效,也不是处理Angular中过滤的最流畅的方法。

有没有人知道这种做法的“角度”方式适合于摘要周期?

0 个答案:

没有答案