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>
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. –
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. –
Das heißt, Sie müssen möglicherweise $ apply in einem "Versprechen" verwenden. Nur ein FYI. –