2016-02-27 3 views
0

Я имею структуру следовать в моей базе данных firebase:

{ 
rooms: { 
    LKVmdIPX2_235ksf: { 
     members: { 
      poasj12O-s657-235a-1236-9832lksf976c: true 
     }, 
     name: Room 1, 
     public: true 
    }, 
    KS0sk21gleascm14: { 
     members: { 
      poasj12O-s657-235a-1236-9832lksf976c: true 
     }, 
     name: Room 2, 
     public: true 
    } 
}, 
users: { 
    poasj12O-s657-235a-1236-9832lksf976c: { 
     rooms: { 
      LKVmdIPX2_235ksf: true, 
      KS0sk21gleascm14: true 
     }, 
     name: Filler 
     email: [email protected] 
    } 
} 

Для того, чтобы каждый номер от определенного пользователя (в данном случае пользователю = poasj12O-s657-235a-1236-9832lksf976c) Я сделано следующее:

$scope.rooms = {}; 
var ref = new Firebase('URL'); 
var userRef = ref.child('users').child(uid); // I'm manage to get the user's UID after login; 
var roomRef = ref.child('rooms'); 

userRef.child('rooms').on('child_added', function(data) { 
    roomRef.child(data.key()).on('value', function(rData) { 
     console.log(rData.val()); // prints each room object 
     $scope.rooms = $firebaseArray(rData.ref()); 
    }); 
}); 

Так что для того, чтобы иметь возможность отобразить эту информацию в представлении я попытался:

$scope.rooms = $firebaseArray(rData.ref()); 

проблема заключается в том, когда я console.log($scope.rooms) Я просто получаю пустой объект, а также, если я положил его на вид {{rooms}}, он даже показывает мне все комнаты, которые есть у пользователя.

Так как это мой вопрос, как я могу запросить конкретную информацию пользователя с моими собственными индексами и передать ее в $ firebaseArray, чтобы синхронизировать с моим представлением?

OBS: console.log(rData.val()) печатает нужные объекты, которые я хотел бы иметь в переменной $ scope.room.

Это ссылка, где я нашел «запрос» https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

+0

Отличная структура данных! Вы ищете «расширение« $ firebaseArray »] (https://www.firebase.com/docs/web/libraries/angular/guide/extending-services.html#section-firebasearray). Я знаю, что Като написал здесь отличный ответ, но не может найти ссылку прямо сейчас. –

+0

Найдено: http://stackoverflow.com/questions/30299972/joining-data-between-paths-based-on-id-using-angularfire. Вероятно, я помечаю ваш как дубликат. –

ответ

1

Вы должны заметить, что child_added и значения события асинхронная. Если вы положите console.log в нижней части своего контроллера, вы, вероятно, увидите пустой объект/массив, потому что они еще не заполнены во время выполнения.

Не забудьте вызвать $ scope. $ Apply внутри ваших асинхронных запросов, чтобы ваше представление узнало о новом значении в переменной.

(function() { 
app.controller('lobbyController', 
    function($rootScope, $scope, $state, $ionicHistory, $firebaseArray, $firebaseObject, firebaseObj, nodes) { 

    $scope.rooms = []; // initialize an empty array 

    $scope.campaigns = {}; 
    var uid = $rootScope.authData.uid; 
    var userInfo; 
    userRef  = firebaseObj.child(nodes.USER_NODE).child(uid); 
    campaignRef = firebaseObj.child(nodes.CAMPAIGN_NODE); 

    userRef.child(nodes.CAMPAIGN_NODE).on('child_added', function(data) { 
     campaignRef.child(data.key()).on('value', function(cData) { 
     // force the view to rerender after a new value came from firebase 
     $scope.$apply(function() { 
      // push the room to rooms array 
      $scope.rooms.push(cData.val()); 
     }) 
     }); 
    }); 

    $scope.createCampaign = function() { 
     $state.go('createCampaign'); 
    } 
    } 
); 
})(); 

Хорошая практика для отладки $ Прицел подвергать его воздействию на объект окна затем проверить его на консоли браузера. Внутри вашего контроллера введите следующий код:

window.$scope = $scope;