Javascript AngularFire:返回$value

Javascript AngularFire:返回$value,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我试图将我的服务.title记录到控制台,但它一直将其作为一个奇怪的对象传回 .factory('service', function($firebase, FBURL, $routeParams) { var ref = new Firebase(FBURL + "services/" + $routeParams.serviceId); var title = $firebase(ref.child('title')).$asObject(); return { id:

我试图将我的
服务.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
。谁能解释一下我可能做错了什么


提前谢谢

它肯定会显示对象 变量title=$firebase(ref.child('title'))。$asObject()

您的标题就是对象

因此,如果您使用console.log,它将打印对象。
如果需要值,请使用console.log($scope.service.title.$value)

它将明确地显示对象 变量title=$firebase(ref.child('title'))。$asObject()

您的标题就是对象

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

您所称的“怪异对象”只是一个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);
});
如果您想在自己的代码中处理数据,您只需要处理这个承诺。如果您只是想将标题绑定到AngularJS视图(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);
});

如果您想在自己的代码中处理数据,您只需要处理这个承诺。如果您只是想将标题绑定到AngularJS视图(AngularFire就是为该视图制作的),该视图将自动更新。好。。。并不是自动的,它会倾听类似的承诺来解决。但在这种情况下,您不必在自己的代码中处理它。

这会将
未定义的
返回到控制台。$scope.service.title有值。。。??我的意思是,正如您附加的图像所示,$value是('$scope.service.title')的子对象,所以它必须是通过链访问的。这就是我的想法。很奇怪$值是该对象中为数不多的元字段之一。这里描述。不过,我似乎无法让它返回我的标题。这会将
未定义的
返回到控制台。$scope.service.title有值。。。??我的意思是,正如您附加的图像所示,$value是('$scope.service.title')的子对象,所以它必须是通过链访问的。这就是我的想法。很奇怪$值是该对象中为数不多的元字段之一。这里描述。不过,我似乎无法让它返回我的头衔。哈!我懂了!在我发布这个问题之前,我试图使用
$loaded
返回它,但它不起作用,所以我认为我做得不对。您能帮助我理解为什么该值不能立即使用吗?两个主要原因:1)由于该值是从服务器检索的,检索可能需要一些时间,浏览器不能简单地等待。2) 该值甚至可能还不存在,或者在某个时间点被更新。Firebase完全是关于实时数据同步的,这意味着数据会随着时间的推移而变化。这个话题已经有很多答案了,我最近链接了这个答案中最有趣的一个:哈!我懂了!在我发布这个问题之前,我试图使用
$loaded
返回它,但它不起作用,所以我认为我做得不对。您能帮助我理解为什么该值不能立即使用吗?两个主要原因:1)由于该值是从服务器检索的,检索可能需要一些时间,浏览器不能简单地等待。2) 该值甚至可能还不存在,或者在某个时间点被更新。Firebase完全是关于实时数据同步的,这意味着数据会随着时间的推移而变化。这个话题已经包含在很多答案中,我最近在这个答案中链接了最有趣的答案: