0

繰り返す一連のイベントがあり、検索ボックスで既にフィルター処理できます。

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

データを ng-repeat する前にフィルタリングする必要があることに気付きました。geoFire を使用しているため、geoQuery 中に次のような方法でフィルタリングしようとしています。

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

key はイベントの uid で、myEvents は上記の myEvents データの firebaseArray です。しかし、indexOfはfirebaseArraysでは機能しないと思いますか? これは機能していないためです。

4

1 に答える 1

1

ここで 2 つの問題が発生しています。

  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()

于 2016-02-23T11:43:36.537 に答える