我正在使用Angularfire,而$firebaseArray
或$firebaseObject
首先没有返回任何内容。这是因为它已经空了或者还没有。但是我想要一直监视那个对象/数组。稍后再说,节点实际存在。原始$firebaseArray
或$firebaseObject
不会触发$ watch事件。
即使节点为空/最初不存在,如何确保$ watch的绑定?当我创建新用户并且某个节点中没有任何内容时,会发生这种情况。
更新1
http://plnkr.co/edit/tQur74nkRIE9ZOiJUAgf?p=preview
JS
var app = angular.module('plunker', ['firebase']);
var Ref = new Firebase('https://so32556276.firebaseio.com');
app.controller('MainCtrl', function($scope, $firebaseObject) {
$scope.data = $firebaseObject(Ref.child('user'));
$scope.data.$loaded().then(function(res) {
$scope.data.$watch(function(e) {
console.log('Something changed');
console.log(e);
});
});
$scope.changeName = function() {
$scope.data.name = "test2";
$scope.data.$save();
}
$scope.changeAge = function() {
$scope.data.age = "10";
}
});
HTML
<body ng-controller="MainCtrl">
<p>Hello {{data.name}}!</p>
<p>Your age is {{data.age}}!</p>
<a href="" ng-click="changeName()">Change Name</a><br>
<a href="" ng-click="changeAge()">Change Age</a>
</body>
火力地堡
如果我点击&#34;更改名称&#34;,您可以在此处看到日志事件:
Something changed
app.js:10 Object {event: "value", key: "user"}
如果我点击&#34;更改年龄&#34;,虽然前端可以检测到变量,但$watch
无法看到此变量。在控制台中没有任何东西。
有任何线索如何避免这种情况?
答案 0 :(得分:1)
在大多数情况下,当我看到有人试图使用$loaded()
时,他们仍然陷入“首先加载数据,然后做......”的心态。 Firebase(以及AngularFire)是“同步这些数据,无论何时它发生变化......”系统。你使用$watch()
绝对是正确的方法,你只是在错误的时刻附上它。
app.controller('MainCtrl', function($scope, $firebaseObject) {
$scope.data = $firebaseObject(Ref.child('user'));
$scope.data.$loaded().then(function(res) {
$scope.data.$watch(function(e) {
console.log('Something changed');
console.log(e);
});
});
从Firebase加载初始数据后,$loaded()
承诺即可完成;或者一个Firebase确定还没有数据。您只能在加载初始数据后注册$watch()
处理程序,因此只会在此之后触发更改。
解决方案是立即将$watch()
处理程序附加到$firebaseObject
:
app.controller('MainCtrl', function($scope, $firebaseObject) {
$scope.data = $firebaseObject(Ref.child('user'));
$scope.data.$watch(function(e) {
console.log('Something changed');
console.log(e);
});