2017-10-17 3 views
0

Je suis en train d'écrire une requête pour une base de données dénormalisé, en utilisant l'exemple de Firebase, ce que je suis en train de faire est:Angular2 - firebase le renvoi dénormaliser requête

obtenir la liste des formes sous l'utilisateur actuel pour chaque élément de cette liste renvoie une référence à chaque élément

Voici mon code:

getFormList():firebase.database.Reference { 
    // the old method 
    //return firebase.database().ref('/formsByID').orderByChild('userList').startAt(this.userId).endAt(this.userId); 

    var formRef = firebase.database().ref("/formsByID"); 
    var userRef = firebase.database().ref("/userProfiles"); 

    // this is our list of forms under the child node 
    var userFormRef = userRef.child(this.userId).child("formsList"); 

    // when an item is added to our list of forms 
    userFormRef.on("child_added", function(snap) { 
     // snap.key is key of our form taken from forms list 
     //let formKey = snap.key(): string; 
     return formRef.child(snap.key); 
    }); 

    } 

Le problème est que tapuscrit attend une valeur de retour de ma méthode de getFormList, mais une valeur ne retournera quand un ne valeur w est ajouté à mon userFormRef - toute aide appréciée

+0

Peut-être que j'ai besoin de diviser en 2 fonctions - va essayer cela – rhysclay

Répondre

0

La méthode getFormList() ne renverra jamais une valeur dans votre cas.

L'instruction return appartient à la fonction de rappel.

userFormRef.on("child_added", function(snap) { 
    return formRef.child(snap.key); // this returns a value for your callback function 
}); 

Je ne suis pas sûr de ce que vous voulez atteindre, mais si vous voulez avoir accès à l'snap en dehors de la méthode getFormList() vous devez mettre en œuvre là ou passer le rappel à la méthode getFormList().

Cela ressemblerait à ceci:

getFormList(cb):firebase.database.Reference { 
    // the old method 
    //return firebase.database().ref('/formsByID').orderByChild('userList').startAt(this.userId).endAt(this.userId); 

    var formRef = firebase.database().ref("/formsByID"); 
    var userRef = firebase.database().ref("/userProfiles"); 

    // this is our list of forms under the child node 
    var userFormRef = userRef.child(this.userId).child("formsList"); 

    // when an item is added to our list of forms 
    userFormRef.on("child_added", cb); 
    } 

Et regarderait l'appel de méthode comme ceci:

getFormList(function(snap) { 
    // do something with your snap outside the function 
}); 

Mais oui, il dépend à peine de votre cas d'utilisation.

+0

Merci beaucoup pour votre aide - j'ai fini par trouver la réponse grâce à ce que vous m'avez dit - affichera la réponse – rhysclay

0

Ok, donc je l'ai compris grâce à @Orlandster. Le problème était que j'essayais de faire beaucoup dans mes fournisseurs. Lorsque vous travaillez avec angulaire et firebase, vos fournisseurs ne devraient vraiment renvoyer une référence. Je réécris mes fournisseurs en 2 méthodes comme celle-ci:

// this returns a list of forms (ref) of the current user 
    getUserFormsRef(): firebase.database.Reference { 
    var userRef = firebase.database().ref("/userProfiles"); 
    return userRef.child(this.userId).child("formsList"); 
    } 

    // this returns a form list (ref) 
    getFormListRef(): firebase.database.Reference { 
    return firebase.database().ref("/formsByID"); 
    } 

Puis sur lui-même mon élément, je fais ce qui suit:

// list the forms 
    ionViewDidLoad() { 
    // get a list of the users forms as a reference 
    this.formProvider.getUserFormsRef().on("child_added", userFormsSn => { 
     this.formList = []; 
     // get the forms reference based on the keys returned from our users forms reference 
     // then push into our form list array - voila! 
     this.formProvider.getFormListRef().child(userFormsSn.key).on("value", formsSn => { 
     this.formList.push({ 
      id: formsSn.key, 
      name: formsSn.val().name 
     }) 
     }); 
    }); 
    } 

Encore une fois l'affaire est que les appels à mon formProvider ne reviennent jamais une référence de base de données type d'objet. C'est essentiellement comment vous pouvez faire un équivalent Firebase d'une requête WHERE dans un ensemble de données dénormalisé.