Angularfire:从控制器中的 $firebaseObject 获取嵌套数据
Angularfire: Getting nested data from a $firebaseObject in controller
这里是 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
在 Firebase 中它看起来像:
我的控制器的代码如下:
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
.
相同的值
您正在对 Firebase 执行查询:
userChallengeRef
.child(path)
.orderByChild('timestamp')
.limitToLast(1))
当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
这意味着您需要使用 $firebaseArray
来获取结果并迭代 it/them。当使用常规 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 对您有任何帮助。您应该只对直接绑定到 Angular UI 的东西使用 AngularFire 服务。对于所有其他操作,只需直接使用 Firebase JavaScript SDK。它使您的代码更简单,并且更容易推理您的应用程序的逻辑与其 UI.
这里是 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
在 Firebase 中它看起来像:
我的控制器的代码如下:
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
.
您正在对 Firebase 执行查询:
userChallengeRef
.child(path)
.orderByChild('timestamp')
.limitToLast(1))
当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
这意味着您需要使用 $firebaseArray
来获取结果并迭代 it/them。当使用常规 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 对您有任何帮助。您应该只对直接绑定到 Angular UI 的东西使用 AngularFire 服务。对于所有其他操作,只需直接使用 Firebase JavaScript SDK。它使您的代码更简单,并且更容易推理您的应用程序的逻辑与其 UI.