Firebase $ authWithOAuthRedirect在没有页面刷新的情况下不会调用$ onAuth

时间:2015-08-07 08:23:59

标签: angularjs ionic-framework ionic firebase angularfire

我有一个简单的Firebase Facebook OAuth登录设置,如下面的official tutorial用于Ionic Firebase Facebook登录。

问题是,一旦我点击登录Facebook按钮,我就被重定向到Facebook,我登录,然后我被重定向回我的应用程序。但问题是我留在登录页面。奇怪的是,如果我通过按F5 ionic serve触发器来物理刷新浏览器(使用onAuth测试),我将被重定向到Items页面。如果我不刷新浏览器,则onAuth不会被调用。

有人有这个问题吗?你是怎么解决的?

请注意,是的,我做了我的研究(并且稍微开始失去它),但无法让它发挥作用。我搜索了SO,尝试使用来自Google群组的$timeout,试图调用$ scope。$ apply(),但都没有用 - 所以请帮我弄清楚我做错了什么?



.controller('AppCtrl', function($scope, Items, Auth, $state, $ionicHistory) {
    $scope.login = function(provider) {
        Auth.$authWithOAuthRedirect(provider).then(function(authData) {

        }).catch(function(error) {
            if (error.code === "TRANSPORT_UNAVAILABLE") {
                Auth.$authWithOAuthPopup(provider).then(function(authData) {
                    
                });
            } else {
                console.log(error);
            }
        });
    };

    $scope.logout = function() {
        Auth.$unauth();
        $scope.authData = null;

        $window.location.reload(true);
    };

    Auth.$onAuth(function(authData) {
        if (authData === null) {
            console.log("Not logged in yet");
            $state.go('app.login');
        } else {
            console.log("Logged in as", authData.uid);
            
            $ionicHistory.nextViewOptions({
                disableBack: true
              });
            $state.go('app.items');
        }
        $scope.authData = authData; // This will display the user's name in our view
    });
})

<ion-view view-title="Members area">
    <ion-content padding="true">
        <div ng-if="!authData">
            <button class="button button-positive button-block" ng-click="login('facebook')">Log In with Facebook</button>  
        </div>       
        
        <div ng-if="authData.facebook">
            <div class="card">
                <div class="item item-text-wrap">Hello {{authData.facebook.displayName}}!</div>                
            </div>

            <button class="button button-assertive button-block" ng-click="logout()">Log out</button>
        </div>        

    </ion-content>
</ion-view>
&#13;
&#13;
&#13;

编辑:我使用$ timeout解决了这个问题:

$timeout(function(){
    Auth.$onAuth(function(authData) {
        if (authData === null) {
            console.log("Not logged in yet");
            $state.go('app.login');
        } else {
            console.log("Logged in as", authData.uid);

            $ionicHistory.nextViewOptions({
                disableBack: true
              });
            $state.go('app.items');
        }
        $scope.authData = authData; // This will display the user's name in our view
    });
}, 3000);

然而,这只是感觉不对(温和地说),并且必须有更好的方法,所以请建议一个。此外,我注意到高达3秒的延迟几乎不够(我发现建议500ms的资源很少就足够了,但就我而言,情况并非如此)。

2 个答案:

答案 0 :(得分:4)

发布在github上的问题,但也会在这里回复。

这仅在使用function Get-MongoDBCollection ($connectionString, $db, $collection) { $mongoClient = New-Object MongoDB.Driver.MongoClient($connectionString) $mongoServer = $mongoClient.GetServer() $mongoDatabase = $mongoServer.GetDatabase($db) $mongoCollection = $mongoDatabase.GetCollection($collection) return $mongoCollection } 的浏览器中发生。该示例适用于cordova应用程序,因此这不应该是一个问题。

但如果你真的需要它,你可以跳过重定向并使用弹出窗口。

$authWithOAuthRedirect

答案 1 :(得分:4)

这是在最新的Firebase JS客户端版本(2.3.0)中修复的错误。您现在可以使用$authWithOAuthRedirect,并在导航回页面时触发$ onAuth回调。