【问题标题】:Why is this angular value not updating?为什么这个角度值没有更新?
【发布时间】: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


【解决方案1】:

尝试在回调中添加 $scope.$apply():

var unamecallback = function(exists) {
        console.log("exists = " + exists);
        if(exists) {
            $scope.data.usernameAvailable = -1;
        } else {
            $scope.data.usernameAvailable = 1;
        }
        $scope.$apply();
    };

【讨论】:

  • $scope.$apply 接受一个函数——您可以将输出包装在该函数中。正如你写的那样,$scope.$digest 足以触发脏检查和更新(它不需要函数)。把它换掉,我会看到它被赞成。
  • 请注意$scope.$apply() 将调用$rootScope.$digest(),因此它与$scope.$digest() 并不完全相同。我想说$apply$digest() 更安全但效率更低。
  • 我自己已经找到了这个解决方案。谢谢大家。
  • @Kato 如果你有代表;我建议你进行编辑。我不太明白你的建议。
  • @runTarm,当正在修改的变量显然在本地范围内并且对祖先不可用时,我看不出它在 $rootScope 上的必要性?
猜你喜欢
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多