刚刚开始学习角度,但是我一直在用jQuery制作一个网站,现在我开始使用一些与网站挂钩的应用程序。
我遇到的问题是我找不到获取子属性并在ref中使用它的方法。我想要获得价值"示例"在下面的示例中:
users: {
simplelogin:1 {
CurrentGroup : "example"
}
}
我通常用jQuery做的事情就像:
currentUserRef.on('value', function(snapshot){
currentGroup = snapshot.val().CurrentGroup;
});
var checkCurrentGroup = setInterval (function(){
if ( currentGroup !== undefined ) {
clearInterval(checkCurrentGroup);
var currentGroupUsersRef = new Firebase(FB + "/groupUsers/" + currentGroup);
//Rest of the code for the page/app
}}, 200);
那么,这是如何在Angular中完成的?我的尝试是复制firebase指南中的示例:
app.factory("Profile", ["$firebase", function($firebase) {
return function(username) {
var userRef = new Firebase(FB + "/users/" + username);
return $firebase(userRef).$asObject();
}
}]);
app.controller("ProfileCtrl", ["$scope", "Profile",
function($scope, Profile) {
console.log("profile = ", Profile(uid));
console.log("profile current group = ", Profile(uid).CurrentGroup);
}
]);
控制台日志:
profile = d {$$ conf:Object,$ id:" simplelogin:76",$ priority:null,$ save:function,$ remove:function ...} $$ conf:Object $ id :" simplelogin:76" $ priority:nullCurrentGroup:" Big Group" displayName:" Jim" email:" someone@email.com" firstLogin :trueprovider:"密码" provider_id:" simplelogin:76" proto :对象
个人资料当前组=未定义
我可以选择用户对象,但是当我user.currentGroup
时,它将是未定义的。不知道我是否在正确的轨道上。
答案 0 :(得分:3)
AngularFire的$asObject()
会返回$FirebaseObject,您的服务又会返回该API documentation for $asObject()
。我刚注意到{{3}}状态:
返回同步对象。在服务器上更新数据时,将更改(但不替换)本地副本以匹配。
不幸的是,这不是真的(或充其量:容易误解)。
Firebase将数据从服务器加载(并同步)到客户端代码异步。由于数据(或更新的数据)可能需要相当长的时间才能返回,因此AngularFire的$asObject()
会返回一个所谓的承诺:未来某个时间的数据结构将包含您请求的数据。显然,当您访问Profile(uid).CurrentGroup
时,数据尚未下载。
当您简单地将对象绑定到视图时,大部分问题都不是问题,就像在AngularJS中一样。如果你这样做,当新的(或更新的)数据可用时,AngularFire会自动通知AngularJS,然后AngularJS会更新视图。魔术!
但是你的console.log
声明不是这种魔法的一部分。因此,您需要自己处理承诺。幸运的是,这并不是非常困难和非常普遍;我上面引用的“不直观的”API文档如此常见,包含了如何执行此示例:
var record = sync.$asObject();
record.$loaded().then(function() {
console.log("record ID:", record.$id);
});
您应该能够非常轻松地为您的数据修改此代码段。但请记住:当您只是将对象绑定到AngularJS视图时,通常不需要$loaded()
个处理程序。在这种情况下,AngularFire的三向数据绑定应该会自动运行。