2016-02-22 1 views
0

У меня есть набор событий, которые я повторяю, и они уже могут быть отфильтрованы в окне поиска.Фильтр 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 + "https://stackoverflow.com/users/" + auth.uid + "/events/"); 
     if (ref.child.equalTo(allEvent.event.$id) !== allEvent.event.$id) { 
     filtered.push(item); 
      } } 
     return filtered; 
    } }]) 

Я думаю, что это должно выглядеть примерно так, но я не могу передать «allEvent.event. $ ID» в фильтр (который является firebase ключ к этому событию). Любая помощь была бы потрясающей, спасибо!

Редактировать

Текущие данные выглядит как-

myEvents:

"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 
}; 

Где ключ - это uid события, а myEvents - это firebaseArray данных myEvents сверху. Но я предполагаю, что indexOf не работает в firebaseArrays? Потому что это не работает.

ответ

1

Вы ударяя две проблемы здесь:

  1. Firebase can only query based on the presence of a value, not on the absence of a value
  2. Firebase can only query for a single value, not for multiple values

Так что ваше решение будет:

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

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

+0

Звучит хорошо.Загрузка их не проблема, у меня есть allEvents и myEvents, но как сделать шаг №3? Я пробовал такие вещи, как myEvents.indexOf («Ключ одного единственного allEvent»), но это, похоже, не работает. – Alteredorange

+0

Это зависит от того, что вы храните о событиях, как в глобальном списке, так и в списке пользователей. Это поможет, если вы добавите репрезентативный фрагмент данных JSON (текст, пожалуйста, никаких скриншотов) на ваш вопрос. –

+0

Спасибо за помощь Фрэнк, я добавил данные. Я использую geoFire, поэтому в идеале я пытаюсь определить, соответствует ли событие myEvent во время функции geoQuery. – Alteredorange

Смежные вопросы