【问题标题】:Angular2 - firebase returning denormalized queryAngular2 - firebase 返回非规范化查询
【发布时间】:2018-03-29 05:25:09
【问题描述】:

我正在尝试使用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 个函数——我会试试的

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


【解决方案1】:

好的,感谢@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。

【讨论】:

    【解决方案2】:

    在您的情况下,getFormList() 方法永远不会返回值。

    你的return声明属于回调函数。

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

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

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

    【讨论】:

    • 非常感谢您的帮助-感谢您告诉我的信息,我最终找到了答案-将发布答案
    猜你喜欢
    • 2017-05-15
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2014-04-19
    • 2013-02-05
    • 2015-01-04
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多