我正在尝试使用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时才会返回一个值 - 任何帮助表示赞赏
答案 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。