2013-05-09 2 views
7

Ich versuche den angemeldeten Benutzer in einem AngularJS-Bereich aufzuzeichnen, erhalte jedoch einen Fehler, wenn die Seite zum ersten Mal geladen wird.

Klicken Sie auf "Login" scheint zu funktionieren, aber dann abmeldet Bail mit dem gleichen "$ apply in progress" Fehler.

Ich erwarte, ich habe gerade missverstanden, wie $apply funktioniert, kann jemand helfen?

aktualisieren:

Es funktioniert nahtlos, wenn ich nur die if (user) Teil in $apply() wickeln wie folgt.

var auth = new FirebaseAuthClient(ref, function(error, user) { 
    if (user) { 
     $scope.$apply(function(){ $scope.user = user; }); 
     console.log(user); 
    } else if (error) { 
     // I can't vouch for this, haven't tested it 
     $scope.$apply(function(){ $scope.user = null; }); 
     console.log(error); 
    } else { 
     $scope.user = null; 
     console.log("logged out"); 
    } 
}); 

Originalcode:

app.js:

var app = angular.module('app', ['firebase']); 

controller.js:

app.controller('Login', ['$scope', 'angularFire', 
function($scope, angularFire) { 
    $scope.loginstatus = 'logged out'; 

    var ref = new Firebase("https://app.firebaseio.com/"); 
    var auth = new FirebaseAuthClient(ref, function(error, user) { 
     if (user) { 
      $scope.$apply(function(){ $scope.loginstatus = 'logged in'; }); 
     } else if (error) { 
      $scope.$apply(function(){ $scope.loginstatus = 'error'; }); 
      alert("Login error: " + error); 
     } else { 
      $scope.$apply(function(){ $scope.loginstatus = 'logged out'; }); 
     } 
    }); 

    $scope.login = function(provider, args) { 
     auth.login(provider, args); 
    } 

    $scope.logout = function() { 
     auth.logout(); 
    } 
}]); 

index.html:

<!DOCTYPE html> 
<html lang="en" ng-app="app"> 
<head> 
    <meta charset="utf-8"> 
    <title>App</title> 
    <script type="text/javascript" src="https://cdn.firebase.com/v0/firebase.js"> 
    <script type="text/javascript" src='https://cdn.firebase.com/v0/firebase-auth-client.js'></script></script> 
    <script type="text/javascript" src="lib/angular/angular.js"></script> 
    <script type="text/javascript" src="lib/angularFire.js"></script> 
    <script type="text/javascript" src="js/app.js"></script> 
    <script type="text/javascript" src="js/controllers.js"></script> 
</head> 
<body ng-controller="Login"> 
    <p>Login status: {{loginstatus}}</p> 
    <div class="container"> 
     <h1>Login</h1> 
     <p> 
     <button ng-hide="user" ng-click="login('twitter')" class="btn btn-primary btn-large">Login</button> 
     <button ng-show="user" ng-click="logout()" class="btn btn-primary btn-large">Logout</button> 
     </p> 
    </div> 
</body> 
</html> 

Antwort

1

$apply wird nur benötigt, wenn Sie sich außerhalb des Kontexts von Angular befinden (wie ein setTimeout-, setInterval- oder nicht-angularer XHR-Rückruf).

Da FireBaseAuthClient ein Tool ist, das mit Blick auf Angular geschrieben und in Ihren Controller geschrieben wurde, ist es wahrscheinlich, dass die Callbacks bereits in $scope.$apply eingeschlossen sind. Sie können den Code beheben, indem $scope.$apply entfernen, so einfach:

var ref = new Firebase("https://app.firebaseio.com/"); 
var auth = new FirebaseAuthClient(ref, function(error, user) { 
    if (user) { 
     $scope.loginstatus = 'logged in'; 
    } else if (error) { 
     $scope.loginstatus = 'error'; 
     alert("Login error: " + error); 
    } else { 
     $scope.loginstatus = 'logged out'; 
    } 
}); 
+0

Beifall für die Antwort, aber das funktioniert nicht. Das war es, womit ich anfangen musste. Der Callback funktioniert cos Ich kann die Konsolenausgabe sehen, wenn ich sie dort hinein schiebe, aber '$ scope' wird nicht aktualisiert. Dies ist symptomatisch dafür, nicht "inside angular" zu sein, weshalb ich anfing, an $ apply() zu fummeln. –

+0

Es funktioniert, wenn ich nur die "eingeloggte" Logik umschließe und die Logout-Logik wie oben beschrieben belasse. Siehe meine ursprüngliche Frage für ein Update. –

+0

Das heißt, Sie müssen möglicherweise $ apply in einem "Versprechen" verwenden. Nur ein FYI. –

Verwandte Themen