我一直在实现基于不同字段过滤表格的功能,起初看起来相当简单,但现在事情变得越来越复杂,我想确保我有效地利用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中过滤的最流畅的方法。
有没有人知道这种做法的“角度”方式适合于摘要周期?