从firebase获取一个孩子并将其用作参考

时间:2015-02-01 05:06:00

标签: angularjs firebase angularfire

刚刚开始学习角度,但是我一直在用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时,它将是未定义的。不知道我是否在正确的轨道上。

1 个答案:

答案 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的三向数据绑定应该会自动运行。