4

AngularFire を使用する次のコントローラーがあります。

app.controller("authController", function($scope, $firebaseSimpleLogin){

var ref = new Firebase("https://myapp.firebaseIO.com/");
$scope.auth = $firebaseSimpleLogin(ref, function(error, user){
    if(error){
        console.log(error);
    }
    else if(user){
        console.log(user);
    }
    else{
        console.log("user logged out");
    }
});

// This shows a valid object
console.log($scope.auth);

$scope.createAccount = function(){
    console.log("found me");
    $scope.auth.$createUser($scope.email, $scope.password, function(error, user){
        console.log("something");
        console.log(user);
        if(!error){
            console.log(user);
        }
        else{
            console.log(error);
        }
    });
};

});

$scope.createAccount関数をイベントにバインドng-clickし、バインドされたボタンをクリックするとconsole.log("found me")、ブラウザーで実行されますが、他のconsole.logコマンド$scope.createAccountは表示されません。

関数を設定する前に使用したconsole.log($scope.auth)コマンドは、関数が定義され$scope.createAccountた有効なオブジェクトを示しています。$createUser

実行時にコンソール エラーが表示されない$scope.createAccountため、呼び出しが「正常に」行われたと想定しています。

認証オブジェクトを表示できるのに、呼び出し後にコールバックを受信できないのはなぜ$createUserですか?

4

1 に答える 1

12

これは、Angular 表記ではなく JavaScript 表記に基づいてコールバックを行っていたために発生していました。私は AngularFire メソッドを使用していたので (これらのメソッドは標準の JavaScript SDK メソッドと同じ名前ですが$、前に記号が付いています)、Angular の$promise方法論を使用してコールバックを処理する必要がありました。

私が変更され

$scope.auth.$createUser($scope.email, $scope.password, function(error, user){
    // do things;
});

$scope.auth.$createUser($scope.email, $scope.password)
    .then(function(user){
        // do things if success
    }, function(error){
        // do things if failure
    }); 

コールバックは期待どおりに機能しました。

上記には、vanilla JSfirebaseSimpleLoginコンストラクターと Angular$firebaseSimpleLoginコンストラクターの例外があります。通常の JS コンストラクターでは、コンストラクターにコールバックがあり、ユーザーがログイン/ログアウトするときにスクリプトが何をすべきかを指定できます。次の形式に従います。

var auth = new firebaseSimpleLogin(ref, function(error, user){
    if(error){
        // do things if login failure
    }
    else if(user){
        // do things when login succeeds 
    }
    else{
        // do things when user logs out
    }
});

Angular コンストラクターで同じことをしようとすると、次のようになります。

$scope.auth = $firebaseSimpleLogin(ref)
    .then(function(user){
        // do things when login succeeds 
    }, function(error){
        // do things when login fails     
    });

エラーが表示されます。Angular コンストラクターにはコールバック メソッドはありません。$watch $scope.auth.userAngular ではデータ バインディングがあり、変数の状態に応じてアプリで簡単に変更や操作を実行できるため、これは意図的に行われたと推測しています。$scope.auth.userが に設定されている場合null、ユーザーはログアウトされます。値が 以外nullに設定されている場合、ユーザーはログインしています。

于 2014-07-02T16:56:36.833 に答える