2017-10-17 3 views
0

私は私が何をしようとしています何を、Firebaseからの例を使用して、非正規化データベースのクエリを記述しようとしていますです:Angular2 - firebase戻っ非正規化クエリ

がために、現在のユーザー 下のフォームのリストを取得しますこのリストの各項目は、各項目への参照を返す。ここ

は私のコードです:

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); 
    }); 

    } 

問題はそのtypescriptですが、私のgetFormListメソッドから返される値を期待しているが、その値は、ときにのみ返されますアネw値が私のuserFormRefに追加されました - ご協力ありがとうございます

+0

おそらく私はこれを2つの関数に分割する必要があります - それを試してみましょう – rhysclay

答えて

0

getFormList()メソッドはあなたのケースでは決して値を返しません。

あなたはreturnのステートメントはコールバック関数に属しています。

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

私はあなたが達成したいのかわからないんだけど、あなたはそこにそれを実装するか、getFormList()メソッドにコールバックを渡す必要があるでしょうgetFormList()方法のsnap外部へのアクセスを取得したい場合。

これは、次のようになります。

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); 
    } 

そして、メソッド呼び出しは次のようになります。

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

しかし、ええ、それはほとんどあなたのユースケースに依存しません。

+0

あなたの助けをありがとう - 私はあなたが私に言ったことのおかげで答えを見つけ出しました - 答えを投稿します – rhysclay

0

だから私は@オランダのおかげでそれを理解した。問題は、私がプロバイダで多くをやろうとしていたことでした。角度とfirebaseを使って作業する場合、プロバイダは実際に参照を返すだけです。その後、私のコンポーネント自体に、私は次の操作を行い

// 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"); 
    } 

:私はこのような2つの方法に私のプロバイダを書き直し

// 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 
     }) 
     }); 
    }); 
    } 

もう一度トリックは私のformProviderへの呼び出しが唯一のこれまでのデータベースの参照を返すということですオブジェクトタイプ。これは基本的に、正規化されていないデータセットでWHEREクエリと同等のFirebaseを実行する方法です。

関連する問題