studio - Cómo unirte a datos desnormalizados que tienen dos niveles de profundidad en Firebase
leer datos de firebase javascript (1)
Aquí está el escenario: tengo una lista de temas; cada tema incluye publicaciones; y cada publicación fue "gustada" por una lista de usuarios. Por lo tanto, mi información se ve así:
"topics": {
"topic1": {
"posts": {
"post1": true,
"post2": true
}
}
},
"posts": {
"post1": {
"title": "An awesome post",
"likes": {
"user1": true
}
},
"post2": {
"title": "An even better post",
"likes": {
"user1": true,
"user2": true
}
}
},
"users": {
"user1": {
"name": "Mr. T",
"email": "[email protected]"
},
"user2": {
"name": "Mr. Hello World",
"email": "[email protected]"
}
}
Yo (creo que) sé cómo obtener todas las publicaciones para el tema usando Firebase.util ( http://firebase.github.io/firebase-util ):
Firebase.util.intersection(
fb.child(''topics'').child(''topic1'').child(''posts''),
fb.child(''posts'')
)
Pero ahora me gustaría que cada publicación incluya los nombres de los usuarios a los que les gustó la publicación. ¿Cómo hace uno eso?
Probablemente no cambiará nada, pero todo esto está sucediendo en AngularFire.
La esencia de este tipo de desnormalización es atrapar a los usuarios a medida que captas las publicaciones. No es nada más complejo de lo que parece. Solo ve a atraparlos.
Firebase hace mucho trabajo internamente para optimizar las solicitudes y reutiliza la misma conexión de socket para todos los oyentes, por lo que es bastante eficiente: apenas más sobrecarga que la cantidad de bytes que se descargan, independientemente de si están divididos en rutas separadas o almacenados juntos.
El HTML:
<h3>Normalizing user profiles into posts</h3>
<ul ng-controller="ctrl">
<li ng-repeat="post in posts | orderByPriority" ng-init="user = users.$load(post.user)">
{{user.name}}: {{post.title}}
</li>
</ul>
El JavaScript:
var app = angular.module(''app'', [''firebase'']);
var fb = new Firebase(URL);
app.controller(''ctrl'', function ($scope, $firebase, userCache) {
$scope.posts = $firebase(fb.child(''posts''));
$scope.users = userCache(fb.child(''users''));
});
app.factory(''userCache'', function ($firebase) {
return function (ref) {
var cachedUsers = {};
cachedUsers.$load = function (id) {
if( !cachedUsers.hasOwnProperty(id) ) {
cachedUsers[id] = $firebase(ref.child(id));
}
return cachedUsers[id];
};
cachedUsers.$dispose = function () {
angular.forEach(cachedUsers, function (user) {
user.$off();
});
};
return cachedUsers;
}
});