【问题标题】:angular + firebase auth + material = router crashesangular + firebase auth + material = 路由器崩溃
【发布时间】:2018-08-22 14:45:14
【问题描述】:

firebase 身份验证后路由器无法正常工作。问题来自@angular/animations,无论是导入 NoopAnimationsModule 还是 BrowserAnimationsModule 路由器都无法正常工作

package.json

"dependencies": { "@angular/animations": "^5.2.8", "@angular/cdk": "^5.2.4", "@angular/common": "^5.2.0", "@angular/compiler": "^5.2.0", "@angular/core": "^5.2.0", "@angular/forms": "^5.2.0", "@angular/http": "^5.2.0", "@angular/material": "^5.2.4", "@angular/platform-browser": "^5.2.0", "@angular/platform-browser-dynamic": "^5.2.0", "@angular/router": "^5.2.0", "angularfire2": "^5.0.0-rc.6", "core-js": "^2.4.1", "firebase": "^4.11.0", "rxjs": "^5.5.6", "zone.js": "^0.8.19" }

一旦通过 Google 身份验证,我将重定向到路由“/protected”,但页面显示新的路由组件和前一个组件:

问题一定是 Angularfire 和 Material Animations 之间的兼容性问题:评论 BrowserAnimationsModule 的导入解决了这个问题。

为了帮助理解和重现,您有:
- StackBlitz project 烦人的部分是这个例子有效,但仍然呈现出两个组件都显示的过渡状态。
- 一个github repository,用最少的代码重现错误。
- 上一个 repo 中的 app running

一旦我找到修复程序,firebase 凭据将停止工作,因此请使用您自己的。

提前致谢。

【问题讨论】:

  • 你应该做一个最小的工作示例,而不是像这样给我们你的整个代码......没有人有时间阅读你的所有代码并发现你的错误......
  • 如果两条路线都显示了,那么您的控制台中应该会出现错误。而且我没有使用我的 Google 帐户登录您的应用程序,据我所知,依赖项没有任何问题,您可能做错了什么。
  • 其实这是一个最小的工作示例
  • 不,不是。整个项目不被认为是“最小的”。它也不是“可验证的”,因为我们不能接触代码,只能访问缩小和捆绑的源。但可以肯定的是,它是“完整的”,我可以给你!使用 stackblitz 重现您的错误,让我们来解决它。
  • 您的问题是在本地还是在生产中?

标签: angular firebase firebase-authentication angular-material


【解决方案1】:

尤里卡!尤里卡!

出于某种原因,您正在做的工作超出了角度范围。因此login.component 中的.then 不会触发lifecycle.tick,这将更新完整的UI。在您的应用程序中,您可以看到login component template 将在多个void 事件(键盘或鼠标输入)后消失,因为它会触发tick,但您无法指定它会在多少事件后消失。

这与我们在 angularJs 中使用 $scope.$apply 手动触发 digest cycle 的原因类似。

手动执行outsideAngularWork的角度4方式需要在login.component中修改如下

import { Component, OnInit } from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';
import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import { NgZone } from '@angular/core';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {

  constructor( private router: Router,private zone: NgZone, private afAuth:AngularFireAuth) { }

    login(){
      this.zone.runOutsideAngular(() => {
        this.afAuth
        .auth
        .signInWithPopup(new firebase.auth.GoogleAuthProvider())
        .then(()=>{
            this.zone.run(() => { this.router.navigate(['/protected']);
          });
        })
        .catch(console.error);
      });
    }
}

希望这也能解决您机器上的问题。

【讨论】:

  • 好猜测,我只是有一个问题,因为 firebase 有打字稿定义,而且在我使用它(包括身份验证)期间,我从未遇到过这个问题。但绝对值得一试!
  • 我将向材料打开一个问题,希望他们拥有解决此问题的关键,而无需此解决方法。到目前为止,这是一个很好的解决方案,谢谢!
  • 这个问题好像是从firebase结束的。他们必须使用angular observable 而不是vanilla js promise
  • 这个解决方案帮助了我。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-04
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多