Unir datos entre rutas basadas en id usando AngularFire

Actualmente estoy trabajando en una aplicación que usa firebase y angularJS (iónica). Básicamente, esta es una aplicación de gestión de automóviles, por lo que tiene personas que comparten sus coches con otros. Traté de estructurar los datos lo más plana posible para ser eficiente. Mi problema aquí es que si sin problemas puedo mostrar la lista de car_id de los diferentes autos compartidos con el usuario registrado, no puedo encontrar una manera de mostrar la lista de autos compartidos con el usuario que muestra el año y el modelo.

Gracias de antemano por su ayuda !

{ "rules": { "users": { ".write": true, "$uid": { ".read": "auth != null && auth.uid == $uid" }, "cars": { "car_id":true, "role":true // Owner, borower... } }, "cars": { "car_id":true, "model":true, "year":true } } 

}

 carapp.controller("carsController", function($scope, $firebaseObject, $ionicPopup, $ionicHistory) { $ionicHistory.clearHistory(); $scope.list = function() { frbAuth = frb.getAuth(); if(frbAuth) { var userObject = $firebaseObject(frb.child("users/" + frbAuth.uid)); userObject.$bindTo($scope, "user"); $scope.cars = frb.child("cars"); }} $scope.createCar = function() { $ionicPopup.prompt({ model: 'Create a new car', inputType: 'text' }) .then(function(result) { if(result !== "") { var newCar = $scope.cars.push({ model: result }) var newCarId = newCar.key(); $scope.user.cars.push({car_id: newCarId, role: "owner" }); } else { console.log("Action not completed"); } }); } 

});

  
 

{{car.model}}

----> How to get this working ?

{{car.year}}

----> How to get this working ?
   

En los users/ ruta, comience almacenando la lista de autos por índice, en lugar de en una matriz. Entonces tu estructura sería:

 { "users": { "kato": { "cars": { "DeLorean": true } } }, "cars": { "DeLorean": { model: "DeLorean", year: "1975" } } } 

Para unirte a esto usando AngularFire, tienes varios enfoques disponibles. Una solución solo de AngularFire podría verse así, aprovechando $ extend :

 app.factory('CarsByUser', function($firebaseArray) { return $firebaseArray.$extend({ $$added: function(snap) { return new Car(snap); }, $$updated: function(snap) { // nothing to do here; the value of the index is not used }, $$removed: function(snap) { this.$getRecord(snap.key()).destroy(); }, // these could be implemented in a manner consistent with the // use case and above code, for simplicity, they are disabled here $add: readOnly, $save: readOnly }); var carsRef = new Firebase(...).child('cars'); function Car(snap) { // create a reference to the data for a specific car this.$id = snap.key(); this.ref = carsRef.child(this.$id); // listen for changes to the data this.ref.on('value', this.updated, this); } Car.prototype.updated = function(snap) { this.model = data.model; this.year = data.year; } Car.prototype.destroy = function() { this.ref.off('value', this.meta, this); }; function readOnly() { throw new Error('This is a read only list'); } }); app.controller('...', function($scope, CarsByUser, authData) { // authenticate first, preferably with resolve var ref = new Firebase(...).child(authData.uid); $scope.cars = CarsByUser($scope); }); 

Para un enfoque más sofisticado y elegante, se podría utilizar NormalizedCollection y pasar esa referencia a la matriz AngularFire:

 app.controller('...', function($scope, $firebaseArray) { var ref = new Firebase(...); var nc = new Firebase.util.NormalizedCollection( ref.child('users/' + authData.uid), ref.child('cars') ) .select('cars.model', 'cars.year') .ref(); $scope.cars = $firebaseArray(nc); });