Firebase angularfire$watch()是一个属性,而不是整个对象?(火基,角形)

Firebase angularfire$watch()是一个属性,而不是整个对象?(火基,角形),firebase,angularfire,Firebase,Angularfire,当对象中的一个属性发生更改时,是否有方法进行监视?我试过了 var unwatch = obj.$watch(function() { console.log("data changed"); }); 当对象中的任何属性更改时激发的。我试过了 var unwatch = obj.myProperty.$watch(function() { console.log("data changed"); }); 它返回了一条错误消息:“TypeError:obj.myProperty.$wa

当对象中的一个属性发生更改时,是否有方法进行监视?我试过了

var unwatch = obj.$watch(function() {
  console.log("data changed");
});
当对象中的任何属性更改时激发的。我试过了

var unwatch = obj.myProperty.$watch(function() {
  console.log("data changed");
});
它返回了一条错误消息:“TypeError:obj.myProperty.$watch不是函数”

我试过了

var myTargetValue = $firebaseObject(ref.myProperty);

返回错误消息:“TypeError:无法读取未定义的属性“ref”。

您必须为该属性创建
$firebaseObject
。但是,使用Firebase SDK往往比
$watch()
更有用

angular.module('app', ['firebase'])
  .constant('FirebaseUrl', 'https://34474165.firebaseio-demo.com/')
  .service('rootRef', ['FirebaseUrl', Firebase])
  .controller('MyCtrl', MyController);

function MyController($scope, $firebaseObject, rootRef) {
  var objRef = rootRef.child('obj');
  var obj = $firebaseObject(objRef);
  var objMessage = $firebaseObject(rootRef.child('obj/message'));

  // watch the whole object
  var unwatch = obj.$watch(function(a) {
    console.log(a);
  });

  // watch a child property
  objMessage.$watch(function(a) {
    console.log(a, 'msg');
  });

  // get the whole object as it changes
  objRef.on('value', function(snap) {
    console.log(snap.val());
  });

  // get the child property as it changes
  objRef.child('message').on('value', function(snap) {
    console.log(snap.val());
  });
}
简短回答-使用香草火基(即不要使用角火) 要使用Angularfire查看字符串、数字或布尔属性,最好使用vanilla Firebase:

// firebase reference
db = firebase.database().ref().child("myTable");

// watch the property
db.child("someProperty").on("value", function(snapshot) {
  $scope.message = snapshot.val();
});
为什么不使用Angularfire和$value: 使用
$firebaseObject
并传入对基元(字符串、数字、布尔值)的引用,将返回如下()所示的对象:

在本例中,我试图查看的字符串包含在返回对象的$value属性中。我倾向于将$value属性分配给
$scope
,但是这不起作用:

// WONT WORK 
$scope.foo = $firebaseObject(db.child("myProperty")).$value;
Angular的对象命名约定和Firebase的对象命名约定之间存在冲突,这在这里造成了一些麻烦。根据文档中的说明,Angular的
$watch
函数忽略带有
$
前缀的属性。换句话说,如果将返回对象的
$value
属性指定给
$scope
,则视图不会更新


因此,最好只使用vanilla firebase来解决这个问题(见上图)。希望大家觉得这有帮助

交叉帖子:托马斯:我带着同样的问题来到这里,今天早上花了一段时间写了一个更全面、简洁和解释性更强的答案。请更新我的答案,以便未来的访问者更容易找到:)我正在尝试制作一个我在AirBnB上看到的功能。您在表单中输入数据,将鼠标移出表单,几秒钟后会出现一个绿色动画,显示“已保存”。即,我想去掉表单上的“提交”按钮。你的回答让我明白了一部分:$scope.targetCustomerDefinitionSaved=“”$firebaseObject(itemRef.child('targetCustomer1/targetCustomerDefinition'))。$watch(function(){$scope.targetCustomerDefinitionSaved=“Saved”;})我将
targetCustomerDefinitionSaved设置为空字符串,因此刷新页面时视图中不会显示任何内容。然后,当您在字段中输入数据时,值变为“已保存”,视图中出现“已保存”一词。
watch()
在用户在该字段中输入新数据时触发,而不是在任何其他字段中输入新数据时触发。也就是说,它观察的是一个值,而不是整个对象。到目前为止,一切正常……但是,当您刷新页面时,在输入任何数据之前,页面上会显示“已保存”:-(为了诊断问题,我执行了以下操作:
// WONT WORK 
$scope.foo = $firebaseObject(db.child("myProperty")).$value;