【发布时间】:2014-07-16 13:49:47
【问题描述】:
这看起来像 AngularFire 101,但我终其一生都无法弄清楚为什么它不起作用。
在我的控制器中:
var unamecallback = function(exists) {
console.log("exists = " + exists);
if(exists) {
$scope.data.usernameAvailable = -1;
} else {
$scope.data.usernameAvailable = 1;
}
};
$scope.usernameInUse = function()
{
var username = $scope.data.color.value + $scope.data.animal.value + $scope.data.digits;
usergenService.usernameInUse(username, unamecallback);
};
在服务中:
usernameInUse: function(username, callback) {
console.log("searching for " + username);
var usersRef = new Firebase(FBURL + '/users/');
var user = usersRef.child(username);
user.once('value', function(ss) {
var exists = (ss.val() !== null);
callback(exists);
});
}
当 usernameInUse 被触发时,控制台的输出:
//searching for Username2 usergenService.js:23 // username being searched for
//exists = false usergenController.js:47 // does not exist
//searching for Username1 usergenService.js:23 // a different username
//exists = true // does exists
我在 $scope.data.usernameAvailable 上有以下 $watch:
$scope.$watch('data.usernameAvailable', function() {
console.log($scope.data.usernameAvailable);
});
但正如您从控制台输出中看到的那样 - 每次都会触发回调,但 $scope.data.usernameAvailable 值没有更新。这并不完全正确。它有时会更新,但肯定不是每次回调被击中时都会更新。更新时也不总是“正确”的。有时它在应该为真时被设置为假,反之亦然。
嗯。帮忙?
【问题讨论】:
-
我的猜测是 user.once 没有调用 $scope.$digest。
-
我遇到了类似的问题,并在此处写了博客:jeffryhouser.com/index.cfm/2014/6/2/… 我的解决方案是运行 $scope.$apply()。在你的情况下,我会在回调中这样做。
-
就像@Sargo 说的,把
$scope.$digest()或$scope.$apply()放在unamecallback函数的末尾 -
@MonkRocker,确实是 AngularFire 101。通常,更喜欢 $scope.$digest() 而不是 $apply(),除非您要将代码包装在一个函数中并将其传递给 $apply()——如果您这样做,它会在内部进行一些很好的错误处理。但是,在 AngularFire 中,我们通常会发现服务最简单的方法是调用 $timeout(callback)。这样一来,你的回调总是会触发 $digest,而且每次使用都无需担心 $digest。
标签: javascript angularjs angularjs-scope angularfire