使用NativeScript

时间:2017-10-06 01:01:24

标签: typescript firebase firebase-realtime-database nativescript angular2-nativescript

如何使用Eddy Verbruggen的nativescript-plugin-firebase插件读取Firebase数据库中节点的值?

我想阅读路径的内容:

/players/{player_id}

是否有类似于FIRDatabaseRef.observeSingleEvent()(在iOS SDK中)或firebase.database()。once()(在js SDK中)?

在nativescript-plugin-firebase插件中,我尝试使用firebase.addValueEventListener(),但是它接收回调作为参数,我真的很喜欢一个方法,它返回一个带有读取值的Promise。此外,我需要在执行读取后手动删除观察者。

使用firebase.query()似乎也不太合适,因为我需要设置过滤器,范围和查询来读取特定路径中的单个值。肯定有一种更好的方式!

谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用firebase.query()和singleEvent = true。为此,我创建了一个名为once()的函数:

once(path, key) {
    return firebase.query(
      ()=>{},
      path,
      {
        singleEvent: true,
        orderBy: {
          type: firebase.QueryOrderByType.KEY
        },
        ranges: [{
          type: firebase.QueryRangeType.EQUAL_TO,
          value: key
        }],
        limit: {
          type: firebase.QueryLimitType.FIRST,
          value: 1
        }
      })
      .then(
        queryResult => {
          // A query result contains a dictionary containing all objects that matched the query criteria. As we are interested on obtaining a single object, we can assume that dictionary will have only a single element.
          // 
          let queryValue = queryResult.value;
          let keys = Object.keys(queryValue); 
          if (keys.length > 0) {
            let key = keys[0]
            let value = queryValue[key];
            return Promise.resolve(value);
          } else {
            return Promise.resolve(null);
          }
        }
      )
  }

可以这样使用:

once("/players", userId).then(userData => {console.log(userData)})

我不确定我非常喜欢这种方法。似乎使用查询来访问特定节点可能是有用的。我仍在寻找更好的解决方案。感谢。