【问题标题】:Get a child from firebase and use it as a ref从firebase获取一个孩子并将其用作参考
【发布时间】:2015-02-01 05:05:59
【问题描述】:

刚开始学习 Angular,但我一直在用 jQuery 制作网站,现在开始开发一些与网站连接到相同 firebase 的应用程序。

我的问题是我找不到获取子属性并在 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: "password"provider_id: "simplelogin:76"proto: Object

配置当前组 = 未定义

我可以选择用户对象,但是当我选择user.currentGroup 时,它将是未定义的。不知道我是否在正确的轨道上。

【问题讨论】:

  • "当我执行 user.currentGroup 时,它会是未定义的"您能否编辑您的问题,使其还包含执行此操作的代码(从而触发错误)?
  • 对不起,我有点傻没有把它放进去。现在添加它。
  • 我会在下面写一个快速的答案,但同时已经阅读:stackoverflow.com/questions/27049342/…

标签: angularjs firebase angularfire


【解决方案1】:

AngularFire 的$asObject() 返回一个$FirebaseObject,而您的服务又会返回该$FirebaseObject。我刚刚注意到API documentation for $asObject() 声明:

返回一个同步对象。当服务器上的数据更新时,本地副本将被更改(但不替换)以匹配。

不幸的是,这不是真的(或者充其量是:容易误解)。

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);
});

你应该可以很容易地为你的数据修改这个 sn-p。但请记住:当您只是将对象绑定到 AngularJS 视图时,通常不需要 $loaded() 处理程序。在这种情况下,AngularFire 的三向数据绑定应该会自动工作。

【讨论】:

  • 非常感谢!你的解释很清楚。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2021-05-28
  • 2017-09-21
  • 1970-01-01
  • 2014-07-21
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多