javascript - AngularJS Firebase注销用户不起作用

标签 javascript angularjs ionic-framework firebase firebase-authentication

我的注销功能,链接到注销按钮是:

$scope.logoutUser = function() {
  var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
  ref.unauth();
  console.log(ref.getAuth);
  $state.transitionTo('login');
}

当我单击注销时,它会将以下内容打印到控制台:

function (){x("Firebase.getAuth",0,0,arguments.length);return this.k.P.we()}

我正在检查其他 Controller 中的 authData:

Controller :

.controller('SearchCtrl',
    function ($scope, $http, Movie, $state, UsersRef, AuthData, $timeout) {
      $scope.$on('$ionicView.enter', function () {
        if (!AuthData) {
          console.log("Auth data null!");
          swal("Unauthorized", "You are not logged in", "error");
          $state.transitionTo('login');
        } else {
          console.log("Auth data found: " + AuthData);
          //do stuff
        }
    });
})

工厂:

.factory("AuthData", [
    function () {
      var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
      var data = null;
      ref.onAuth(function (authData) {
        if (authData) {
          data = authData;
        }
      });
      return data;
    }
  ])

如果我注销,然后通过更改 URL 返回到链接到 SearchCtrl 的页面,它仍然说它找到了 authData。

但是,如果我第一次打开应用程序时尝试进入搜索页面,在任何人登录之前,它都会给我正确的错误消息并退出到登录页面。

如何确保用户退出后无法返回应用?

最佳答案

欢迎来到异步编程 101。

Firebase 的 onAuth 方法监听身份验证状态的更改。当身份验证状态发生更改时,将调用您提供的回调方法。但是,当它等待身份验证状态更改时,您的其他代码将继续运行。

如果您在代码中添加一些日志语句,最容易看到这一点:

.factory("AuthData", [
    function () {
      var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
      var data = null;
      console.log('before onAuth');
      ref.onAuth(function (authData) {
        console.log('in callback');
        if (authData) {
          data = authData;
        }
      });
      console.log('after onAuth');
      return data;
    }
  ])

输出将是:

before onAuth

after onAuth

in callback

这可能不是您编写此代码时所期望的。

在代码中解决此问题的最简单方法是使用同步 ref.getAuth() 方法:

.factory("AuthData", [
    function () {
      var ref = new Firebase("https://buzzmovieionic.firebaseio.com");
      return ref.getAuth();
    }
  ])

但是您会经常遇到这种异步问题。我强烈建议使用和研究 AngularFire,而不是重新发明轮子。

关于javascript - AngularJS Firebase注销用户不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36949652/

相关文章:

AngularJS Bootstrap 单选按钮组

angularjs - 如何以编程方式更改 ui-view 模板 URL

javascript - 如何在ReactJS中实现带有受控组件的动态表单?

javascript - 以编程方式向 Google Apps 脚本中的加载项添加基于时间的触发器

javascript - knockout 绑定(bind) 'with' 别名 'as'

javascript - AngularJS 文件拖放指令

css - 在 Ionic 中下拉

javascript - 返回 AngularJS 中两个数组值之间的匹配

angular - 数据存储变量如何修复

javascript - 在 Meteor 中填充子文档