2015-11-04 84 views
0

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

在该示例中,您可以通过切换复选框来查看不完整的任务。这在控制器中通过观察$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。现在,如果我想通过不完整和优先级= $ scope.priority任务来过滤待办事项列表,我理解Mongo查询需要沿着Tasks.find({ $and: [{ checked: {$ne: true} },{ priority: $scope.priority }]},{ sort: { createdAt: -1 } })的行。

在我的应用程序,我已经能够做两个观察家正确地跟踪变化两个变量的范围,类似于我的$scope.hideCompleted$scope.priority例子,但我不知道如何采取下一步合并查询过滤集合时。我也修修补补周围有点与this package,因为我最终会希望能够过滤和排序许多标准,但我切换到我这里描述的概念之前,并没有得到它太远。

我很感激任何帮助。谢谢!

回答

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受到青睐,因为它们将在范围销毁时移除订阅和对象/集合。

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

+0

这看起来非常简单,并以较少的几行完成同样的事情。我在控制器的其他地方处理订阅,所以我可能需要做一些调整,但我认为我会更喜欢这种方法,因为它可以用较少的几行完成相同的事情。我还需要阅读$ meteorSubscribe和$ meteorCollection。 – aliigleed

+0

太棒了,如果你遇到你的调整,不要犹豫,开始一个新的问题。此外,如果您不介意,请标记正确的答案,以便他人更容易找到;) –

+0

是的,我计划一旦测试出来就标记出来。 :)今天早上我试了一下,看来它工作得很好,并且调整我现有的代码也不错。但是,我注意到这将在任何模型完全更改之前应用过滤器(即,在开始时返回无需执行任务,因为所有任务都分配了优先级,并且一旦客户机将优先级设置为输入表格)。 – aliigleed

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}}) 
}); 
+0

你在建立你所有的查询客户端吗?如果我编辑了Tasks.find调用会发生什么?确保你正在处理规则serverside – Neil

+0

@neil你会扩展你的意思吗?编辑我的Tasks.find调用和处理规则serverside?我现在在这里使用这两个答案的变体,但无论如何,在发布函数服务器端,我有查询,排序等规则。 – aliigleed

+1

我只是指出你需要确保你处理服务器端的规则,这样如果我恶意编辑你的客户端Task.find,我不能惹你的分贝。大多数人使用允许/拒绝规则,但我觉得这个lib非常有用 - https://github.com/ongoworks/meteor-security – Neil