【问题标题】:AngularFire: Return $valueAngularFire:返回 $value
【发布时间】:2015-01-23 20:10:58
【问题描述】:

我正在尝试将我的 service.title 记录到控制台,但它一直将它作为一个奇怪的对象传递回来。

.factory('service', function($firebase, FBURL, $routeParams) {
  var ref = new Firebase(FBURL + "services/" + $routeParams.serviceId);
  var title = $firebase(ref.child('title')).$asObject();

  return {
    id: $routeParams.serviceId,
    title: title
  }
})

.controller('ServiceController', function ($scope, $firebase, service, $routeParams, FBURL) {
  $scope.service = service;

  console.log($scope.service.title);
})

这是我从控制台返回的内容:

我正在尝试在控制台日志中检索 $value。谁能帮忙解释一下我可能做错了什么?

提前致谢!

【问题讨论】:

    标签: javascript angularjs firebase angularfire


    【解决方案1】:

    你所说的“一个奇怪的对象”只是一个 AngularFire 对象。考虑到您是这样分配的,这几乎是意料之中的:

    var title = $firebase(ref.child('title')).$asObject();
    

    当你对一个简单的值调用 $asObject 时,AngularFire 将真实值保存在 $value 属性中。

    当然,该值是从 Firebase 服务器异步检索的,因此在您设置 ref 和被调用的 $asObject 后不会立即可用。所以这行不通:

    var ref = new Firebase(FBURL + "services/" + $routeParams.serviceId);
    var title = $firebase(ref.child('title')).$asObject();
    console.log(title.$value);
    

    相反,您需要在它可用时做出响应,AngularFore 对此有一些不错的承诺:

    var ref = new Firebase(FBURL + "services/" + $routeParams.serviceId);
    var title = $firebase(ref.child('title')).$asObject();
    title.$loaded().then(function(title) {
      console.log(title.$value);
    });
    

    如果你想在你自己的代码中处理数据,你只需要处理这个promise。如果您只是想将标题绑定到 AngularJS 视图(这是 AngularFire 的用途),该视图将自动更新。嗯......不是真的自动,它会监听类似的承诺来解决。但在这种情况下,您不必在自己的代码中处理它。

    【讨论】:

    • 哈!我懂了!在发布此问题之前,我试图使用$loaded 将其返回,但它不起作用,所以我认为我做错了。你能帮我理解为什么这个值不能立即可用吗?
    • 两个主要原因: 1)由于该值是从服务器检索的,因此可能需要一些时间才能检索到,浏览器不能简单地等待。 2)该值甚至可能还不存在,或者在某个时候更新。 Firebase 完全是关于实时数据同步,这意味着数据会随着时间而变化。这个话题已经有很多答案了,我最近在这个答案中链接了最有趣的:stackoverflow.com/questions/27049342/…
    【解决方案2】:

    它肯定会向您展示对象 var title = $firebase(ref.child('title')).$asObject();

    你的标题就是对象

    因此,如果您 console.log 它会打印该对象。 如果你想要价值使用 console.log($scope.service.title.$value)

    【讨论】:

    • 这会将undefined 返回到控制台。
    • $scope.service.title 有价值...??我的意思是它在您附加的图像中显示 $value 是 ('$scope.service.title') 的子级,因此它必须通过链访问。
    • 我就是这么想的。很奇怪。 $value 是属于该对象的少数元字段之一。在这里描述。 firebase.com/docs/web/libraries/angular/guide.html 不过,我似乎无法让它返回我的头衔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    • 2021-12-31
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多