值更改后AngularJS不会更新

值更改后AngularJS不会更新,angularjs,firebase,angularfire,Angularjs,Firebase,Angularfire,我的目的是在用户登录后更新导航栏。基本上,它应该在登录之后立即将登录名更改为Hi,{{usr.username}。 但是,它在登录后不会更新,我必须再次单击登录以触发更改。但是,在控制台中,用户信息在登录后立即被记录 在index.html中,代码部分如下所示: <div class="item" ng-click="loginmodal()" ng-hide="loggedIn">Log in</div> <div class="item" ng-show="lo

我的目的是在用户登录后更新导航栏。基本上,它应该在登录之后立即将登录名更改为Hi,{{usr.username}。 但是,它在登录后不会更新,我必须再次单击登录以触发更改。但是,在控制台中,用户信息在登录后立即被记录

在index.html中,代码部分如下所示:

<div class="item" ng-click="loginmodal()" ng-hide="loggedIn">Log in</div>
<div class="item" ng-show="loggedIn">Hi, {{usr.username}}</div>
在控制台中,$scope.loggedIn为true,但$scope.usras为null

我使用authWithPassword函数的方式是否错误,或者我是否可以强制更新更改?

尝试在更改$scope.usr值后立即调用$scope.$digest。 无论如何,请注意,调用Firebase以获取用户是异步的,因此我不会将依赖代码放在该调用之后,而是放在回调中。

尝试在更改$scope.usr值后立即调用$scope。$digest。
无论如何,请注意,调用Firebase以获取用户是异步的,因此我不会将依赖代码放在该调用之后,而是放在回调内部。

AngularJS不会更新视图,如果对$scope对象的任何更改都是在其$digest循环之外完成的

但不用担心,Firebase是一个非常流行的工具,它有一个AngularJS服务。它叫做AngularFire,您应该使用它而不是全局Firebase对象

因此,您的代码将类似于:

var auth = $firebaseAuth(FirebaseRef);
auth.$authWithPassword({
    email: email,
    password: password
}).then(function (authData) {
    console.log('Authenticated successfully with payload:', authData);
    var sync = $firebase(FirebaseRef.child("users").child(authData.uid));
    var syncObject = sync.$asObject();
    syncObject.$bindTo($scope, "usr");
}).catch(function (error) {
    console.error('Login Failed!', error);
});

阅读更多信息

如果在$scope对象的$digest循环之外对$scope对象进行任何更改,AngularJS将不会更新视图

但不用担心,Firebase是一个非常流行的工具,它有一个AngularJS服务。它叫做AngularFire,您应该使用它而不是全局Firebase对象

因此,您的代码将类似于:

var auth = $firebaseAuth(FirebaseRef);
auth.$authWithPassword({
    email: email,
    password: password
}).then(function (authData) {
    console.log('Authenticated successfully with payload:', authData);
    var sync = $firebase(FirebaseRef.child("users").child(authData.uid));
    var syncObject = sync.$asObject();
    syncObject.$bindTo($scope, "usr");
}).catch(function (error) {
    console.error('Login Failed!', error);
});
阅读更多

调用$scope.$apply

FirebaseRef.child("users").child(authData.uid).once('value', function(dataSnapshot) {

   $scope.$apply(function(){
      $scope.usr = dataSnapshot.val();
   });

});
调用$scope.$apply

FirebaseRef.child("users").child(authData.uid).once('value', function(dataSnapshot) {

   $scope.$apply(function(){
      $scope.usr = dataSnapshot.val();
   });

});

我认为$scope.user在另一个作用域中,请尝试使用服务更新此值。正如@Miszy所说,您应该使用AngularFire的$firebaseAuth服务,它为您处理对作用域的更新。请看,我认为$scope.user在另一个作用域中,请尝试使用服务更新此值。正如@Miszy所说,您应该使用AngularFire的$firebaseAuth服务,它为您处理对作用域的更新。我试过$digest和$apply。两者都不起作用……现在很好用。我正在使用AngularFire。我尝试了$digest和$apply。两者都不起作用……现在很好用。我用的是角火。