2015-11-04 64 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