【问题标题】:Angular 8 showing blank page with no errorsAngular 8 显示没有错误的空白页面
【发布时间】:2021-10-29 07:30:22
【问题描述】:

我正在开发一个 Angular 8 应用程序,它将使用 JWT 令牌身份验证登录到 .Net Core Rest API。

当我启动应用程序时,应用程序编译成功,没有错误。但是,当我打开http://localhost:4200 时,会出现一个空白页。

这是app-routing.module.ts 文件:

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { LoginComponent } from './login';
import { HomeComponent } from './home';
import { AppComponent } from './app.component';
import { AuthGuard } from './_helpers';

const routes: Routes = [
  {path: '',component:AppComponent,canActivate: [AuthGuard]},
  {path:'login',component:LoginComponent},
  {path: '**',redirectTo:''}
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

这是app.component.ts 文件:

import { Component ,ViewChild,OnInit } from '@angular/core';
import { ApiService } from './api.service';
import { Router } from '@angular/router';
import {Sort} from '@angular/material';
import { Log } from './log';
import {MatPaginator,MatSort,MatTableDataSource} from '@angular/material';

import { AuthenticationService } from './_services';
import { User } from './_models';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent{
  currentUser: User;
  public isViewable:boolean;

  constructor(private apiService: ApiService,private router: Router,private authenticationService: AuthenticationService){
    this.authenticationService.currentUser.subscribe(x => this.currentUser = x);
  }

  dataSource=new MatTableDataSource<Log>();
  displayedColumns: string[] = ['message','create_Date','log_Type'];

  @ViewChild(MatSort,{static:true}) sort: MatSort;

  ngOnInit(){
    this.dataSource.sort=this.sort;

    this.apiService.getLogs().subscribe((res)=>{
      this.dataSource.data=res;    
    });
   }


   public onSortData(sort:Sort){
    let data=this.dataSource.data.slice();
    if(sort.active && sort.direction!==''){
      data=data.sort((a:Log,b:Log)=>{
          const isAsc=sort.direction==='asc';
          switch(sort.active){
            case 'message': return this.compare(a.message,b.message,isAsc);
            case 'create_Date':return this.compare(a.create_Date,b.create_Date,isAsc);
            case 'log_Type':return this.compare(a.log_Type,b.log_Type,isAsc);
            default: return 0;
          }
      });    
    }
    this.dataSource.data=data; 
   }

   private compare(a,b,isAsc){
    return (a.toLowerCase() < b.toLowerCase()  ? -1 : 1) * (isAsc ? 1:-1);
   }

  public toggle():void{
    this.isViewable=!this.isViewable;

    this.apiService.getLogs().subscribe((res)=>{
      this.dataSource.data=res;
     });

    }

    logout() {
      this.authenticationService.logout();
      this.router.navigate(['/login']);
    }
  }

这是login.component.ts 文件:

import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { first } from 'rxjs/operators';

import { AuthenticationService } from '../_services';

@Component({ templateUrl: 'login.component.html' })
export class LoginComponent implements OnInit {
    loginForm: FormGroup;
    loading = false;
    submitted = false;
    returnUrl: string;
    error = '';

    constructor(
        private formBuilder: FormBuilder,
        private route: ActivatedRoute,
        private router: Router,
        private authenticationService: AuthenticationService
    ) { 
        // redirect to home if already logged in
        if (this.authenticationService.currentUserValue) { 
            this.router.navigate(['/']);
        }
    }

    ngOnInit() {
        this.loginForm = this.formBuilder.group({
            username: ['', Validators.required],
            password: ['', Validators.required]
        });

        // get return url from route parameters or default to '/'
        this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
    }

    // convenience getter for easy access to form fields
    get f() { return this.loginForm.controls; }

    onSubmit() {
        this.submitted = true;

        // stop here if form is invalid
        if (this.loginForm.invalid) {
            return;
        }

        this.loading = true;
        this.authenticationService.login(this.f.username.value, this.f.password.value)
            .pipe(first())
            .subscribe(
                data => {
                    this.router.navigate([this.returnUrl]);
                },
                error => {
                    this.error = error;
                    this.loading = false;
                });
    }
}

编辑:

这是auth.guard.ts 文件:

import { Injectable } from '@angular/core';
import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';

import { AuthenticationService } from '../_services';

@Injectable({ providedIn: 'root' })
export class AuthGuard implements CanActivate {
    constructor(
        private router: Router,
        private authenticationService: AuthenticationService
    ) { }

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        const currentUser = this.authenticationService.currentUserValue;
        if (currentUser) {
            // logged in so return true
            return true;
        }

        // not logged in so redirect to login page with the return url
        this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
        return false;
    }
}

我希望看到登录页面,但在我输入ng serve 并打开http://localhost:4200 后出现一个空白页面

【问题讨论】:

  • 出了什么问题?我猜你现在已经解决了,我今天也遇到了同样的问题......
  • 这里是我的solution,希望对您有所帮助
  • 检查您的浏览器控制台,通常会显示错误原因。
  • @EmmanuelAliji 就我而言,控制台中没有错误。并且我的 API 没有错误。

标签: angular angular8


【解决方案1】:

好的,这只是发生在我身上,可能对其他人有帮助:

  • 已安装@nestjs/ng-universal $ ng add @nestjs/ng-universal
  • 我正在处理的 Angular 项目已经安装了 @nguniversal,我已经手动卸载了我发现的所有相关内容。
  • 所以当我安装这个新包时,它再次修改了 /src/main.ts,将 boostrap 包装了两次。
document.addEventListener('DOMContentLoaded', () => {
  document.addEventListener('DOMContentLoaded', () => {
    platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));
  });
});

这给了我一个运行 $ ng serve 的空白页面,没有错误、没有消息、什么都没有,只是一个白色和令人讨厌的页面。
删除 document.addEventListener( ... 包装器之一后,它起作用了!

【讨论】:

  • @guillefd,出于新手主义的原因,我需要一个摘要。所以我应该: 1) 使用 $ ng add @nestjs/ng-universal 安装 2) 向 app.module 添加导入,如 ng-universal repo 所示 3) 替换 document.addEventListener('DOMContentLoaded', () =&gt; { document.addEventListener('DOMContentLoaded', () =&gt; { platformBrowserDynamic().bootstrapModule(AppModule) .catch(err =&gt; console.error(err)); }); }); 的 main.ts 代码是这样吗?提前非常感谢
  • 如果这不起作用,请检查您的浏览器控制台。错误通常会显示在那里。
【解决方案2】:

这个问题通常很难识别。但是,它可能与应用程序启动期间执行的代码错误有关。这很可能包括启动任何类型的身份验证模块。

检查/调试您的 app.module.ts 以及从那里调用的所有内容 - 例如 APP_INITIALIZER

【讨论】:

    【解决方案3】:

    请检查您的“AuthGuard”。检查它是否返回 true。由于您的默认根目录已受到保护,如果它返回 false,那么我认为这就是您的页面未加载的原因。

    【讨论】:

    • 我编辑了问题并添加了 AuthGuard 文件。你能再检查一下代码吗?
    • 如果您需要更多代码,请告诉我,我将编辑问题并编写更多代码
    【解决方案4】:

    最近我在 chrome 浏览器中遇到了同样的问题,在更新 chrome 版本后,这个问题得到了修复。 您可以通过在 IE 或 Safari 等其他浏览器中进行交叉检查来验证此问题是否与浏览器有关。

    编辑:除此之外,请尝试禁用 chrome 中的一些扩展。禁用扩展程序后,请确保重新启动浏览器。一旦它工作启用所需的扩展。

    【讨论】:

    • 这比其他答案对我的帮助更大。实际上发现是 OBS 在后台运行导致我的 Angular 应用程序显示为白色。我认为这与渲染有关。 Edge、Chrome 和 Brave(基于所有 Chromium)上的相同问题,Firefox 似乎可以工作。
    【解决方案5】:

    1.- 打开标签。检查 html 文件中是否有正确关闭的标签。就我而言,问题是因为在一个组件中我有一个额外的&lt;/div&gt;

    2.- 未声明的输入。检查您是否尝试传递未在组件中声明的输入,例如&lt;app-component [var1]="123"&gt; &lt;/app-component&gt;,在您的组件中您必须必须声明输入@Input () var1;

    3.- 在某些 html 文件中打印 {{}} 为空的键

    4.- 带有角度标签的未声明属性。例如在 &lt;input [anyWord]&gt; 中 [anyWord] 不是有效条目

    【讨论】:

      【解决方案6】:

      你也可以在重构后检查你的选择器是否被正确命名

      【讨论】:

        【解决方案7】:

        也许您使用的是不受支持的 IE 版本?

        尝试 Chrome、后来的 IE 或 Firefox 等。或者,您可以在 polyfills.ts 中取消对浏览器 polyfills 的注释

        /** IE9, IE10 and IE11 requires all of the following polyfills. **/
        import 'core-js/es6/array';
        import 'core-js/es6/date';
        import 'core-js/es6/function';
        import 'core-js/es6/map';
        import 'core-js/es6/math';
        import 'core-js/es6/number';
        import 'core-js/es6/object';
        import 'core-js/es6/parse-float';
        import 'core-js/es6/parse-int';
        import 'core-js/es6/regexp';
        import 'core-js/es6/set';
        import 'core-js/es6/string';
        import 'core-js/es6/symbol';
        import 'core-js/es6/weak-map';
        

        【讨论】:

          【解决方案8】:

          我遇到了同样的问题,所以我只刷新了两次页面,这是可行的,但你可以试试这个, 在您的路线中,如果 Angular 找不到您输入的任何路线,您应该重定向到 PageNotFoundComponent,所以创建一个组件PageNotFoundComponent 并重定向到该组件,因为除了您指定的那些路由之外,您不处理所有其他路由

           {path: '**',redirectTo:''} // instead of this 
           {path: '**', redirectTo:'PageNotFoundComponent'} // add this
          

          或者您可以在 routerConfig 中使用{ useHash: true } 尝试此操作,所有路由都将使用#/login,您可以将其仅用于开发模式,当您想要发布时,您可以删除此配置{ useHash: true }

          @NgModule({
            imports: [
              ...
              ...
              RouterModule.forRoot(routes, { useHash: true })  // .../#/crisis-center/
            ],
            ...
          })
          export class AppModule { }
          

          【讨论】:

          • 抱歉,两种解决方案我都试过了,但没有一个解决方案有效
          • 如果您需要更多代码,请告诉我,我将编辑问题并编写更多代码
          【解决方案9】:

          检查浏览器控制台,通常错误会显示在那里。如果您的代码中有错误,则会在此处显示。

          【讨论】:

            【解决方案10】:

            在我的例子中,我只是将文件命名为 app.routing.ts 而不是 app-routing.module.ts。通过修复它,它起作用了。

            【讨论】:

              【解决方案11】:

              我的代码的问题是我使用了 keycloak 安装配置对象 即

              {
                              "realm": "demo",
                              "auth-server-url": "http://localhost:8180/auth/",
                              "ssl-required": "external",
                              "resource": "local",
                              "public-client": true,
                              "confidential-port": 0,
                              "clientId": "local"
              }

              但是错了,正确的如下:

              { url: "http://localhost:8180/auth/", 领域:“演示”, 客户 ID:“本地” }

              【讨论】:

                【解决方案12】:

                您认为缺少&lt;router-outlet&gt;&lt;/router-outlet&gt;? (Documentation)

                【讨论】:

                  猜你喜欢
                  • 2018-11-16
                  • 2023-03-04
                  • 1970-01-01
                  • 2023-03-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-09-12
                  • 2017-09-05
                  • 2021-06-11
                  相关资源
                  最近更新 更多