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, он возвращает все заказы, как ожидалось. Но даже если бы фильтр работал, это не решило бы мою проблему, потому что я хочу получать как текущие пользовательские события, так и все другие события. Firebase не имеет «не равно» опцию фильтра ...

Я попытался перебрать каждую запись и сравнить UIDs и установки 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]; 

Но это вызывает асинхронные проблемы так массив 'bookings', присвоенный $ scope.eventSources, не был изменен. Я попытался переместить $ scope.eventSources = [заказы] внутри блока асинхронного кода, но FullCalendar, по-видимому, не может справиться с этим и ничего не делает.

Я также попытался это, но не повезло либо:

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

Что является лучшим решением моей проблемы?

ответ

0

Если вы хотите изменить данные, которые загружены/синхронизированы с Firebase, вы должны расширить службу $firebaseArray. Выполнение этого через $loaded() неверно, так как это приведет только к исходным данным.

См. Документацию AngularFire по телефону Extending $firebaseArray и ответ Като на примере Joining data between paths based on id using AngularFire.

+1

И пример этого очень прецедента [здесь] (https://gist.github.com/katowulf/f78d4a224c06a643ddfa) и [здесь] (http://jsfiddle.net/katowulf/uoe5yt8x/) – Kato

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