Фильтр ng-repeat с данными Firebase

У меня есть набор событий, которые я повторяю, и они уже могут быть отфильтрованы окном поиска.

<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 — это firebaseArray данных myEvents, указанных выше. Но я предполагаю, что indexOf не работает с firebaseArrays? Потому что это не работает.


person Alteredorange    schedule 22.02.2016    source источник


Ответы (1)


Здесь вы сталкиваетесь с двумя проблемами:

  1. Firebase может запрашивать только на основе наличие значения, а не отсутствие значения
  2. Firebase может запрашивать только одно значение, а не несколько значений

Таким образом, ваше решение будет заключаться в следующем:

  1. загрузить полный список событий
  2. загрузить список событий, которые собирается посетить пользователь
  3. зациклиться на #1 и исключить любое событие, которое также находится в #2
  4. привязать список результатов к $scope

Обновление В этом фрагменте показано, как выполнить шаг 3 с описанными вами структурами JSON.

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(), который зацикливается на своих дочерних элементах. И вы можете получить ключ текущего дочернего Snapshot с помощью child.getKey().

person Frank van Puffelen    schedule 23.02.2016
comment
Звучит неплохо. Загрузить их не проблема, у меня есть allEvents и myEvents, но как выполнить шаг №3? Я пробовал такие вещи, как myEvents.indexOf(Key of single allEvent), но, похоже, это не работает. - person Alteredorange; 23.02.2016
comment
Это зависит от того, что вы храните о событиях, как в глобальном списке, так и в пользовательском списке. Было бы полезно, если бы вы добавили репрезентативный фрагмент данных JSON (текст, пожалуйста, без скриншотов) к вашему вопросу. - person Frank van Puffelen; 23.02.2016
comment
Спасибо за помощь, Фрэнк, я добавил данные. Я использую geoFire, поэтому в идеале я пытаюсь определить, соответствует ли событие myEvent во время функции geoQuery. - person Alteredorange; 23.02.2016
comment
Учитывая мой рецепт выше, вы сможете приблизиться к тому, что у вас есть в вашем вопросе сейчас. Шаги 1 и 2 ваши, затем в шаге 3 вы сравниваете ключи. Если это проблема, обновите свой вопрос фрагментом, который у вас есть. - person Frank van Puffelen; 23.02.2016
comment
Привет, Фрэнк, я только что обновил его как раз в тот момент, когда ты комментировал фрагмент, который я использую. Извините, я не могу взломать это... - person Alteredorange; 23.02.2016
comment
Фрэнк, у меня наконец-то все заработало! Спасибо за помощь. Ваше решение не совсем сработало, потому что я имел дело с geoFire, поэтому он не выдвигал массив allEvents, а только одно событие за раз. Так что я закончил тем, что использовал вызов snapshot.foreach, чтобы это произошло. Еще раз спасибо всем за помощь! - person Alteredorange; 24.02.2016