Firebase新手在这里。
在我的控制器中,我有一个名为currentChallenge
的变量,它包含以下$ firebaseObject:
$$conf: {sync: {…}, ref: X, binding: f, listeners: Array(0)}
$id: "gRH2EWGQB6dbejKYap40Z0ea0nz2"
$priority: null
-Kuy9HAfvVIhPhtQraLy:
challenge: {...}
challenger: "gRH2EWGQB6dbejKYap40Z0ea0nz2"
pending: true
timestamp: 1506428920780
__proto__: Object
__proto__: Object
我的控制器的代码如下:
Challenge.lastChallenge(uid, challengeUserId).$loaded()
.then(function (currentChallenge) {
if (currentChallenge.challenger == uid) {
// stuff happens
}
这是调用挑战服务方法:
lastChallenge: function (uid1, uid2) {
var path = uid1 < uid2 ? uid1 + '/' + uid2 : uid2 + '/' + uid1;
return $firebaseObject(userChallengeRef
.child(path)
.orderByChild('timestamp')
.limitToLast(1));
},
我尝试访问的数据是challenger
,但我不确定如何执行此操作,因为$value
似乎无法处理对象。
我不能放-Kuy9HAfvVIhPhtQraLy
,因为根据我正在看的挑战,这可能会有所改变。它也不总是与$id
相同的值。
答案 0 :(得分:2)
您正在对Firebase执行查询:
userChallengeRef
.child(path)
.orderByChild('timestamp')
.limitToLast(1))
对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
这意味着您需要使用$firebaseArray
来获取结果并对其进行迭代。使用常规JavaScript SDK时,它会是这样的:
lastChallenge: function (uid1, uid2) {
var path = uid1 < uid2 ? uid1 + '/' + uid2 : uid2 + '/' + uid1;
return new Promise(function(resolve, reject) {
userChallengeRef
.child(path)
.orderByChild('timestamp')
.limitToLast(1))
.once("value").then(function(snapshot) {
snapshot.forEach(function(child) {
resolve($firebaseObject(child.ref));
});
});
}
将其调用为:
Challenge.lastChallenge(uid, challengeUserId).then(function(firebaseObject){
firebaseObject.$loaded().then(function (currentChallenge) {
if (currentChallenge.challenger == uid) {
// stuff happens
}
请注意,我不认为使用AngularFire可以帮助您。您应该只将AngularFire服务用于直接绑定到Angular UI的内容。对于所有其他操作,只需直接使用Firebase JavaScript SDK即可。它使您的代码更简单,并且更容易推断您的应用程序的逻辑与其UI。