7

ログインしたユーザーを AngularJS スコープに記録しようとしていますが、ページが最初に読み込まれたときにエラーが発生します。

[ログイン] をクリックすると機能するように見えますが、ログアウトすると、同じ「$apply が既に進行中です」というエラーが表示されます。

仕組みを誤解していると思います$applyが、誰か助けてもらえますか?

更新

if (user)次のようにその部分だけをラップすると、シームレスに機能$apply()します。

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");
    }
});

元のコード:

app.js:

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

コントローラー.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>
4

1 に答える 1

1

$applyAngular のコンテキストの外にいる場合にのみ必要です (setTimeout、setInterval、非 Angular XHR コールバックなど)。

FireBaseAuthClient は Angular を念頭に置いて作成され、コントローラーに挿入されたツールであるため、コールバックは既に でラップされている可能性があります$scope.$apply。を削除することでコードを修正できます$scope.$apply

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';
    }
});
于 2013-05-09T02:53:55.113 に答える