0

我正在学习使用 Angular 集成的 Meteor To-Do App 教程,并且正在学习过滤集合。通过遵循本教程中的原则,我已经能够在我正在开发的应用程序的集合上实现一个简单的过滤器,但现在我一直在试图弄清楚如何向过滤器添加多个查询。

在示例中,您可以通过切换复选框来查看未完成的任务。这是在控制器中通过监视$scope.hideCompleted更改并将其作为 Mongo 查询传递以过滤 Meteor 集合来实现的。

观察者

$scope.$watch('hideCompleted', function() {
  if ($scope.hideCompleted)
    $scope.query = {checked: {$ne: true}};
  else
    $scope.query = {};
});

收藏过滤器

$scope.tasks = $meteor.collection(function() {
  return Tasks.find($scope.getReactively('query'), {sort: {createdAt: -1}})
});

如何使查询支持多个过滤器?例如,假设我选择扩展示例并按优先级对每个待办事项进行排名。然后,我将有一个输入字段供用户按优先级过滤集合,其值绑定到$scope.priority. 现在,如果我想通过不完整和 priority=$scope.priority 任务过滤待办事项列表,我知道 Mongo 查询需要类似于Tasks.find({ $and: [{ checked: {$ne: true} },{ priority: $scope.priority }]},{ sort: { createdAt: -1 } }).

在我的应用程序中,我已经能够让两个观察者正确跟踪对两个范围变量的更改,类似于我的示例$scope.hideCompletedand $scope.priority,但我不知道如何在过滤集合时采取下一步合并查询。我还对这个包进行了一些修改,因为我最终希望能够按许多标准进行过滤和排序,但在切换到我在这里描述的概念之前,我并没有走得太远。

我很感激这方面的任何帮助。谢谢!

4

2 回答 2

1

这将是我的方法:

$meteor.autorun($scope, function() {
    // uncomment subscribe after you've got to that point
    // $scope.$meteorSubscribe('yourSubscription').then(function() {
        $scope.tasks = $scope.$meteorCollection(function() {
            return Tasks.find({ 
                checked: $scope.getReactively('model.hideCompleted'),
                priority: $scope.getReactively('model.priority')
            }, { sort: { createdAt: -1 } });
        });
    // });
});

这里有几件事:

  1. 删除后autopublish,您可以取消注释该$scope.$meteorSubscribe方法并替换"yourSubscription"为您实际订阅的名称。
  2. $meteor.autorun每次任何getReactively变量更改时都会触发。
  3. $scope.$meteorSubscribe并且$scope.$meteorCollection受到青睐,因为它们会在作用域被销毁时删除订阅和对象/集合。

如果您有任何问题,那么也许我可以设置一个演示供您查看。

于 2015-11-04T21:13:45.777 回答
0

好吧,我想我比我预期的要近得多,所以我将回答我的问题并分享我为实现多个过滤器所做的工作,以实现关于待办事项应用程序的假设扩展。

我将作用域变量hideCompletedpriority作用域变量设置为作用域对象的属性model,并在最后使用带有参数的单个观察true程序来检查对象是否相等(对其属性或其属性的任何更改)。model然后我$scope.query通过拼接“子查询”来生成。我在下面添加了代码。

目前这似乎工作正常,但我不确定它是否是最好的解决方案,所以我会继续试验,如果我发现更好的答案,我会更新我的答案。不过,我会对任何其他方法感兴趣!

观察者

var initQuery=true;    
var subQueries=[];
$scope.$watch('model', function() {
  if (!initQuery){
    subQueries=[];
    if ($scope.model.hideCompleted)
      subQueries.push({checked: {$ne: true}});
    if ($scope.model.priority)
      subQueries.push({priority: $scope.model.priority});
    $scope.query = { $and: subQueries};
  } else {
    initQuery = false;
    $scope.query = {};
  }
}, true);

过滤器集合(未更改)

$scope.tasks = $meteor.collection(function() {
  return Tasks.find($scope.getReactively('query'), {sort: {createdAt: -1}})
});
于 2015-11-04T19:16:07.803 回答