使用 Firebase 数据过滤 ng 重复

Filter ng-repeat with Firebase Data

本文关键字:ng 重复 过滤 数据 Firebase 使用      更新时间:2023-09-26

我有一组重复的事件,它们已经可以通过搜索框过滤。

<div class="well well-sm" ng-repeat="allEvent in allEvents | filter:searchText | orderBy:sortOrder" ng-if="allEvent.event.name">
   <h3 id="cabynTitles">{{allEvent.event.name}}</h3>
   <h3 id="cabynMemNum">{{allEvent.event.time}} </h3>
   <button class="btn" ng-click="joinEvnt(allEvent.event.$id)">Join</button>
</div>

但是,我试图显示用户已经要去的事件。 这些事件存储在 Firebase 中。

.filter('myEvents', function () {
return function (items) {
    var filtered = [];
    for (var i = 0; i < items.length; i++) {
    var item = items[i];
    var ref = new Firebase(furl + "/users/" + auth.uid + "/events/");
      if (ref.child.equalTo(allEvent.event.$id) !== allEvent.event.$id) {
        filtered.push(item);
           } }
      return filtered;
   } }])

我认为它应该看起来像这样,但我无法将"allEvent.event.$id"传递给过滤器(这是事件的 firebase 键)。 任何帮助都会很棒,谢谢!

编辑

当前数据如下所示-

我的活动:

"events": {
      "-KAw4iDuN2KdN-5pfQs0": true,  //Instead of true, I can also make this the uid
      "-KAw7Nn04WEoTDbatPn4": true
}

所有事件:我使用的是 geofire,所以我在 geoQuery 函数期间获取每个事件,并以此获取所有事件详细信息。

"-KAw4iDuN2KdN-5pfQs0": {
        "name": "Event Name"
        "description": "Blah blah"
         ...
}

我现在意识到在我重复之前必须过滤数据,并且由于我使用的是geoFire,因此我正在尝试在geoQuery期间使用类似以下内容对其进行过滤:

if (myEvents.indexOf(key) == -1) {
    //push evenDetails to array to show in scope
};

其中key是事件的uid,myEvents是上面myEvents数据的firebaseArray。 但我猜indexof在firebaseArrays上不起作用?因为这不起作用。

你在这里遇到了两个问题:

  1. Firebase 只能根据是否存在值进行查询,而不能基于是否存在值进行查询
  2. Firebase 只能查询单个值,而不能查询多个值

因此,您的解决方案将是:

  1. 加载事件的完整列表
  2. 加载用户要访问的事件列表
  3. 循环访问 #1 并排除也在 #2 中的任何事件
  4. 将结果列表绑定到$scope

更新 此代码段演示如何使用您描述的 JSON 结构完成步骤 3。

var myEvents = {
      "-KAw4iDuN2KdN-5pfQs0": true,
      "-KAw7Nn04WEoTDbatPn4": true
};
var allEvents = {
  "-KAw4iDuN2KdN-5pfQs0": {
        "name": "Event Name",
        "description": "Blah blah"
  },
  "-KAw7Nn04WEoTDbatPn4": {
        "name": "Event Name 2",
        "description": "Blah blah"
  },
  "-KAw7Nn04WEoTDbatl9": {
        "name": "Event Name 3",
        "description": "Blah blah"
  }
};
var filteredEvents = [];
Object.keys(allEvents).forEach(function(eventKey) {
  if (Object.keys(myEvents).indexOf(eventKey) == -1) {
    filteredEvents.push(allEvents[eventKey]);
  }
});
document.getElementById('log').innerText = JSON.stringify(filteredEvents);
<pre id='log'></pre>

请注意,还有许多其他方法可以完成相同的任务。例如:Firebase 快照已经有一个循环遍历其子项的 forEach() 方法。并且您可以使用child.getKey()获取当前子快照的密钥。