2017-10-17 31 views
0

我試圖寫一個非標準化的數據庫查詢,使用從Firebase的例子中,我試圖做的是:Angular2 - 火力歸國非規範化的查詢

得到窗體列表當前用戶 下在此列表中的每個項目的引用返回的每個項目

這裏是我的代碼:

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

    } 

的問題是,打字稿期待值從我getFormList方法返回,而是一個價值只會返回時一個ne 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 
}); 

我不知道你想達到什麼,但如果你想獲得訪問snapgetFormList()方法,你會需要有執行或者回調傳遞給getFormList()方法。

這應該是這樣的:

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

好吧,我想出了謝謝@Orlandster。問題是我在提供商中試圖做的很多。當使用angular和firebase時,你的提供者應該只返回一個引用。我改寫了我的供應商到2個方法是這樣的:

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

然後我的組件本身我做了以下內容:

// 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。