Angular2 - firebase返回非规范化查询

时间:2017-10-17 13:34:47

标签: angular typescript firebase firebase-realtime-database ionic3

我正在尝试使用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方法返回一个值,但是只有当一个新值添加到我的userFormRef时才会返回一个值 - 任何帮助表示赞赏

2 个答案:

答案 0 :(得分:0)

getFormList()方法永远不会返回您的案例中的值。

你的return语句属于回调函数。

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

我不确定你想要实现什么,但是如果你想要访问snap方法之外的getFormList(),你需要在那里实现它,或者将回调传递给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
});

但是,这几乎不取决于你的用例。

答案 1 :(得分:0)

好的,所以我想通过感谢@Orlandster。问题是我试图在我的提供商中做很多事情。在使用angular和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");
  }

然后在我的组件本身上执行以下操作:

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