当前位置: 首页 > 面试题库 >

AngularJS使用新的Firebase Auth进行路由和解析

何涵忍
2023-03-14
问题内容

我正在尝试将新的Firebase与Auth系统一起使用,并在$routeProvidervia中限制路由resolves

但是,我不太了解。

这就是我所拥有的。在我的.config函数中,我正在定义路由并初始化firebase。以下是我的配置块中。

$routeProvider
   .when('/', {
      templateUrl: 'templates/dashboard.ejs',
      //resolve. this needs restricted
   })
   .when('/login', {
      templateUrl: 'templates/login.ejs'
   })

firebase.initializeApp(config);

我在新的文档站点上发现这些功能可用,这些功能在我.run()的角度列表中列出。

.run(function($rootScope, $location) {

    $rootScope.authentication = firebase.auth();

    /*firebase.auth().onAuthStateChanged(function(user) {
        if(user) {
            $rootScope.user = user;
        } else {
            $rootScope.user = false;
            $location.path('/login')
        }
    })*/

    var user = firebase.auth().currentUser;

    if (user) {
        $rootScope.user = user;
    } else {
        $rootScope.user = false;
        console.log('No User!');
        $location.path('/login');
    }
})

现在,我上面的内容只是触发every other time我访问网站上的任何URL。

所以我的问题是,我该如何获取.run()函数中的内容并将其转化为routeProvider的解析,以便能够再次限制路由。

使用旧的firebase,您只需像下面那样调用$ firebaseAuth()并拥有一个如下所示的routeChangeError函数。

// In config block. **old way**
$routeProvider
        .when('/', {
            templateUrl: 'templates/dashboard.ejs',
            resolve: {
                "currentAuth": ["$firebaseAuth", function($firebaseAuth) {
                    var ref = new Firebase(fbUrl);
                    var authObj = $firebaseAuth(ref);

                    return authObj.$requireAuth();
                }]
            }
        })

然后是.run()块中的routechangeerror。

 // .run block **old way**
 .run(function($rootScope, $location) {
    $rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) {
        if (eventObj === 'AUTH_REQUIRED') {
            console.log('auth required!');
            $location.path("/login");
        }
    });
})

这不再起作用,因为您不再使用$firebaseAuth()。或new Firebase(fbUrl);就此而言。

更新

我觉得这有点混乱,但是再研究一下路线,我想到了这一点。

在我的路线上解析:

.when('/', {
            templateUrl: 'templates/dashboard.ejs',
            resolve: {
                userAuthenticated: ["$http", "$q", function($http, $q) {
                    var deferred = $q;
                    if(firebase.auth().currentUser) {
                        deferred.resolve();
                    } else {
                        deferred.reject();
                        console.log('Really!?');
                    }
                    return deferred.promise;
                }]
            }
        })

然后是一个简单的routeChangeError。

$rootScope.$on("$routeChangeError", function (event, current, previous, rejection) {
        alert("Not authorised");
})

唯一的问题是,似乎deferred.promise返回undefined。它没有激活routeChangeError函数。即使我console.log()被打了。

可能是因为firebase.auth().currentUser没有用户通过身份验证时返回null吗?


问题答案:

这些方法已重命名为$waitForSignIn()$requireSignIn

您还可以使用该$firebaseRefProvider服务配置数据库URL,以便它自动配置$firebaseAuthService

angular.module('app', ['firebase'])
  .constant('FirebaseDatabaseUrl', '<my-firebase-url>')
  .controller('HomeCtrl', HomeController)
  .config(function($firebaseRefProvider, FirebaseDatabaseUrl, $routeProvider) {
     $firebaseRefProvider.registerUrl(FirebaseDatabaseUrl);
     $routeProvider.when("/home", {
        controller: "HomeCtrl",
        templateUrl: "views/home.html",
        resolve: {
          // controller will not be loaded until $waitForSignIn resolves
          "firebaseUser": function($firebaseAuthService) {
            return $firebaseAuthService.$waitForSignIn();
          }
        }
      }).when("/account", {
        controller: "AccountCtrl",
        templateUrl: "views/account.html",
        resolve: {
          // controller will not be loaded until $requireSignIn resolves
          "firebaseUser": function(Auth) {
            // If the promise is rejected, it will throw a $stateChangeError
            return $firebaseAuthService.$requireSignIn();
          }
        }
      });
  });

function HomeController($scope, $firebaseRef, firebaseUser) {

}


 类似资料:
  • 本文向大家介绍symfony3 使用YAML进行路由,包括了symfony3 使用YAML进行路由的使用技巧和注意事项,需要的朋友参考一下 示例 路由配置包含在您的app/config/config.yml文件中,默认情况下是该app/config/routing.yml文件。 从那里,您可以链接到捆绑包中的自己的路由配置 它还可能包含多个应用程序全局路由。 您可以在自己的捆绑包中配置路由,该路由

  • 问题内容: 我正在研究一个新的ASP.NET MVC和AngularJS应用程序,该应用程序旨在作为SPA的集合。我使用MVC区域概念来分隔每个单独的SPA,然后在每个MVC区域内使用AngularJS创建SPA。 由于我是AngularJS的新手,并且无法找到有关结合MVC和AngularJS路由的答案,因此我想在这里发表我的问题,以查看是否可以获得帮助。 我有标准的MVC路由设置,可用于每个M

  • 在我的React项目中,我有: 没有标题的登录组件 问题:我应该如何构建我的路由器从登录页面开始,当我点击登录时,路由器会把我带到仪表板?

  • 本文向大家介绍AngularJS 路由详解和简单实例,包括了AngularJS 路由详解和简单实例的使用技巧和注意事项,需要的朋友参考一下 AngularJS 路由 本章节我们将为大家介绍 AngularJS 路由。 AngularJS 路由允许我们通过不同的 URL 访问不同的内容。 通过 AngularJS 可以实现多视图的单页Web应用(single page web application

  • 主要内容:AngularJS 实例,路由设置对象,AngularJS 实例本章节我们将为大家介绍 AngularJS 路由。 AngularJS 路由允许我们通过不同的 URL 访问不同的内容。 通过 AngularJS 可以实现多视图的单页 Web 应用(single page web application,SPA)。 通常我们的 URL 形式为 http://xnip.cn/first/page,但在单页 Web 应用中 AngularJS 通过 #! + 标记

  • 我的路由配置有问题。我的应用程序逻辑——我在标题中有一个控制导航的下拉菜单。下拉选项通过下拉菜单下的额外导航栏导航到页面。单击下拉选项时,传递路由参数。问题是,我需要加载组件,它不在导航栏上,但在下拉导航后用作默认屏幕。 第一个导航“层”是下拉列表。之后,URL是index/Param#。 第二个导航“层”是导航栏,它加载在具有url索引/ Param#的页面上。在该页面上,我有组件(“默认屏幕”