2017-01-19 69 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]'。 –