【问题标题】:Firebase Auth Service in Angular -- data not available to all the controllersAngular 中的 Firebase 身份验证服务——数据并非对所有控制器都可用
【发布时间】:2017-08-02 17:28:17
【问题描述】:

我正在尝试创建一个 Angular (1.6) 服务来处理 Firebase 的所有身份验证。

我打算做什么?

我想在我的导航栏(navbar.html 第 23 行)中有一个按钮,它打开一个模式(loginRegister.tpl.html),并且在该模式中具有所有不同的方式来验证应用程序(我想从Facebook)。一旦它获得了来自 Facebook 的用户信息(Auth.js 第 21 行),我想使用 Auth 服务将信息提供给所有控制器,但似乎在我将信息分配给服务属性之后,它并没有反映在引用服务属性的其他地方(main.js 第 14 行)

即使我以用户信息作为参数关闭模式(loginRegister.tpl.js 第 6 行),我也无法将其分配给 navbar.js 第 20 行上的服务属性。

你能帮我解决这个问题吗?

    Auth.facebookSignIn = function(){
        return authObj.$signInWithPopup("facebook")
        .then(function(data){
            Auth.user = data.user;
        })
        .catch(function(error){
            var errorCode = error.code;
            var errorMessage = error.message;
            var email = error.email;
            var credential = error.credential;
            return error;
        });
    }

plnkr

更新

我应该在哪里实现 if(!Auth.userPromise){ ?因为我尝试将其添加到 loginRegister.tpl.js 中,但它实际上并没有在服务中看到 userPromise 属性。

loginRegister.tpl.js

$ctrl.loginFacebook = function () {
    if(!Auth.userPromise) { 
        console.log("No Auth promise"); 
    } else { 
        Auth.userPromise.then(function(user){
            console.log(user);
    });
 } 

更新 #2

我试过了,但它不起作用,我的意思是......它可以安慰用户,但我已经可以做到了。我的问题是,例如,我在 navbar.js(第 6 行)“Auth.user”中引用,它与我所做的无关,我无法更新引用并使其出现在 navbar.html(第 21 行) 我想指出的是,我无法找到一种方法,即一旦用户登录,它就会在Auth 服务被注入的任何地方自动反映。我的问题更清楚了吗?

【问题讨论】:

  • 不清楚您在问什么,因为您所指的代码未包含在问题中。
  • 对不起,底部有链接,欢迎查看。
  • 在创建promise的代码执行后使用promise..
  • Stackoverflow 不是代码调试服务。当询问有关由您的代码引起的问题的问题时,如果您提供人们可以用来重现问题的代码,您将获得更好的答案。该代码应该是…… Minimal – 尽可能少地使用在问题本身仍会产生相同问题的代码。见How to create a Minimal, Complete, and Verifiable example

标签: javascript angularjs firebase firebase-authentication angular-promise


【解决方案1】:

我认为您可以做的是在使用 Auth 服务(facebook 登录)后使用 loginRegister.js 中的结果,然后 getUser 和 setUser 将其放入 userService 之类的新服务中,并在成功验证后将数据设置在那里。现在您可以在任何地方使用 userService(带有用户数据)。

loginRegister.js

$ctrl.loginFacebook = function () {
       Auth.facebookSignIn()
        .then(function(data){
           userService.setUser(data.user); //set user
          console.log(userService.getUser()); //check if it was set properly.
          })
        .catch(function(error){
            var errorCode = error.code;
            var errorMessage = error.message;
            var email = error.email;
            var credential = error.credential;
        });
    };

plunkr

【讨论】:

  • 这行得通...谢谢!但是...app.factory("userService", [function(){ var userService = this; userService.user = { displayName: 'Test!' } userService.setUser = function(data){ userService.user = data.user; }; userService.getUser = function(){ return userService.user; }; return userService; }]);当使用该功能将Facebook的用户数据设置为服务中的属性时...它不会反映在控制器中,其中相同的属性与控制器属性链接。
  • 我认为这个可能对您有所帮助。 link
猜你喜欢
  • 2019-02-14
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多