2017-01-19 109 views
0

我連接到Firebase並從給定位置檢索數據,我想要做的是遍歷snapshot.val()構建和Array,通過它返回Array,然後循環的component.html並建立一個Dropdown返回數組

目前我有困難搞清楚這種服務方法的語法,這是我目前的代碼。 - 這是從app.component.tsngOnInit()

getExerciseOptions(): Array<Exercise> { 

    const items: Exercise[] = []; 

    this.exerciseDbRef2.on("value", (snapshot) => { 

     snapshot.forEach((snap) => { 
      items.push({ 
       id: snap.key, 
       description: snap.val().description 
      }); 
      return false; 

     }); 
    }); 
} 

所以this.exerciseDbRef2點內Firebase表名爲如下所示:

private exerciseDbRef2 = this.fire.database.ref('/exercise_description'); 

目前我收到的錯誤是

A function whose declared type is neither 'void' nor 'any' must return a value. 

哪我明白了,所以當我將return false更改爲return items時,新的錯誤是:

Argument of type '(snap: DataSnapshot) => Exercise[]' is not assignable to parameter of type '(a: DataSnapshot) => boolean'. 
Type 'Exercise[]' is not assignable to type 'boolean'. 

我已經看過用child_added但是從我的理解,這將被稱爲每當一個新的子項添加到該位置,這是不是我要找的時間。在這個位置的孩子不會改變,也不會被添加。 - 也許我錯誤地解釋了'child_added'?

我對Firebase比較陌生,所以我在學習曲線的開頭,所以請裸露出來,我還想提一下,如果我目前這樣做的方式不正確,請帶上它我的注意力。

所以澄清:連接到Firebase,通過snapshot檢索給定的位置即exercise_description表,循環中的所有兒童,建設Array並將其返回。

然後在組件循環中通過Array並構建Dropdown

有人可以請解釋我如何去基於snapshot.val()退回Array

+0

該代碼片段看起來並不完整。你把零碎切碎了嗎?該錯誤意味着'on'回調正在返回一個數組。並且'getExerciseOptions'函數被聲明爲返回'Array ',但不返回任何內容。 – cartant

+0

@cartant感謝您的幫助,它的正確代碼片段。關於如何返回使用從Firebase返回的值構建的數組,我對這個語法感到困惑。理想情況下,我想從這個函數返回'Array ' –

回答

3

由於value事件是異步的,所以不能從getExerciseOptions返回數組。

但是,您可以返回一個承諾:

getExerciseOptions(): Promise<Array<Exercise>> { 
    return this.exerciseDbRef2 
     .once("value") 
     .then(snapshot => { 
     const exercises: Exercise[] = []; 
     snapshot.forEach(snap => { 
      exercises.push({ 
       id: snap.key, 
       description: snap.val().description 
      }); 
      return false; 
     }); 
     return exercises; 
    }); 
} 

你可以這樣稱呼它:

getExerciseOptions().then(exercises => console.log(exercises)); 

如果你不熟悉的承諾,你可能需要閱讀JavaScript Promises: an Introduction

+0

非常感謝這個例子,很快就會嘗試。雖然我在Firebase中有幾個表格,我會在這些表格中的'children.html'頁面上調用並重新返回數據並創建幾個基於子節點的Dropdowns,你提供了什麼從性能方面來說這是否合適?或者我可以在這裏使用可觀察的嗎? - 只是爲了獲得更好的理解,因此這個愚蠢的問題o_O –

+1

任何性能差異取決於你如何組織事物。可觀察到的優點是它們可以繼續發出值 - 因此可以將它們連接到「child_added/removed」事件等,這可能涉及較少的數據傳輸和重複的基於承諾的查詢。我看到你正在使用Angular,所以你可能想看看[AngularFire2](https://github.com/angular/angularfire2),看看observables和Firebase有什麼可能。 – cartant

+0

好聽起來不錯,我還會看看AngularFire2,只是嘗試了你提供的getExerciseOptions方法,我得到以下錯誤:鍵入'Promise '不能分配鍵入'Promise '。 類型'Promise '中缺少屬性'[Symbol.toStringTag]'。 –