0

我正在使用angular-ui-fullcalendar來顯示和編輯事件。用戶可以登錄並在登錄時擁有唯一的uid。我想用它來區分當前用戶與其他事件發生的事件。我想給當前的用戶事件另外backgroundColor用戶使用angularfire過濾數據

什麼是最好的辦法呢?

我嘗試了幾件事。我的數據是這樣的:

``` 
database 
    bookings 
    -KWnAYjnYEAeErpvGg0- 
     end: "2016-11-16T12:00:00" 
     start: "2016-11-16T10:00:00" 
     stick: true 
     title: "Brugernavn Her" 
     uid: "1f17fc37-2a28-4c24-8526-3882f59849e9" 
``` 

我試圖篩選與當前用戶的UID的所有數據這樣

var ref = firebase.database().ref().child("bookings"); 
var query = ref.orderByChild("uid").equalTo(currentAuth.uid); 
var bookings = $firebaseArray(query); 
$scope.eventSources = [bookings]; 

這並不返回任何東西。如果我忽略第2行中的過濾器,它會按預期返回所有預訂。但即使過濾器工作,它也不能解決我的問題,因爲我想獲取當前用戶事件和所有其他事件。火力地堡沒有一個「不等於」過濾選項...

我通過每個記錄試圖循環和比較的UID和設置backgroundColor如果條件滿足:

var ref = firebase.database().ref().child("bookings"); 
var bookings = $firebaseArray(ref); 
bookings.$ref().on("value", function(snapshot) { 
    var list = snapshot.val(); 

    for (var obj in list) { 
     if (!list.hasOwnProperty(obj)) continue; 
     var b = list[obj]; 
     if (b.uid === currentAuth.uid) { 
      b.className = "myBooking"; 
      b.backgroundColor = "red"; 
     } 
    } 
}); 
$scope.eventSources = [bookings]; 

但是這會導致同步問題,所以分配給$ scope.eventSources的'預訂'數組未被修改。我試圖在異步代碼塊中移動$ scope.eventSources = [bookings],但FullCalendar顯然無法處理它,並且什麼也不渲染。

我也試過,但沒有運氣之一:

bookings.$loaded() 
    .then(function(data) { 
     $scope.eventSources = [data]; 
    }) 
    .catch(function(error) { 
     console.log("Error:", error); 
    }); 

什麼是我的問題的最佳解決方案?

回答

0

如果您希望修改從Firebase加載/同步的數據,則應該擴展$firebaseArray服務。通過$loaded()這樣做是錯誤的,因爲這隻會觸發初始數據。

有關示例,請參閱Extending $firebaseArray上的AngularFire文檔以及加藤的Joining data between paths based on id using AngularFire答案。

+1

這是一個非常實用的例子[這裏](https://gist.github.com/katowulf/f78d4a224c06a643ddfa)和[here](http://jsfiddle.net/katowulf/uoe5yt8x/) – Kato