Angular 8 показывает пустую страницу без ошибок

Я разрабатываю приложение Angular 8, которое будет входить в API .Net Core Rest с использованием аутентификации токена JWT.

Когда я запускаю приложение, оно успешно компилируется без ошибок. Однако, когда я открываю 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


person freelancer86    schedule 01.08.2019    source источник
comment
В чем была проблема? Думаю, вы уже решили это, и сегодня у меня такая же проблема ...   -  person Aloene    schedule 15.11.2019
comment
вот мое решение, надеюсь, оно поможет   -  person Manuel Strasser    schedule 24.07.2020
comment
Проверьте консоль браузера, там обычно отображается причина ошибки.   -  person Emmanuel Aliji    schedule 23.11.2020


Ответы (11)


Хорошо, это случилось со мной и может помочь кому-то другому:

  • установлен @ nestjs / ng-universal $ ng add @nestjs/ng-universal
  • в проекте angular, над которым я работаю, уже был установлен @nguniversal, я удалил вручную все, что нашел относящееся к нему.
  • поэтому, когда я установил этот новый пакет, он снова изменил /src/main.ts, обернув вдвое усиление.
document.addEventListener('DOMContentLoaded', () => {
  document.addEventListener('DOMContentLoaded', () => {
    platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.error(err));
  });
});

Это дало мне пустую страницу, работающую $ ng serve без ошибок, без сообщений, без ничего, просто белая и неприятная страница.
После удаления одной из document.addEventListener( ... оберток все заработало!

person guillefd    schedule 07.12.2019
comment
@guillefd, для новичков нужен дайджест. Поэтому мне следует: 1) установить с помощью $ ng add @ nestjs / ng-universal 2) добавить импорт в app.module, как показано в репозитории ng-universal 3) заменить код main.ts на document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => { platformBrowserDynamic().bootstrapModule(AppModule) .catch(err => console.error(err)); }); }); Это все? Заранее большое спасибо - person cgobbet; 23.01.2020
comment
Если это не сработает, проверьте консоль браузера. Там обычно отображается ошибка. - person Emmanuel Aliji; 23.11.2020

Эта проблема, скорее всего, связана с ошибкой в ​​коде, которая запускается при запуске приложения. Скорее всего, это включает запуск любого модуля аутентификации.

Проверяйте / отлаживайте свой app.module.ts и все, что вызывается оттуда - например, APP_INITIALIZER.

person Yuri    schedule 11.02.2020

Недавно я столкнулся с той же проблемой в браузере Chrome, после обновления версии Chrome эта проблема исправлена. Вы можете проверить эту проблему, связанную с браузером или нет, перепроверив в других браузерах, таких как IE или Safari.

Изменить: в дополнение к этому, попробуйте отключить некоторые расширения в Chrome. Обязательно перезапустите браузер после отключения расширений. Как только он заработает, включите необходимые расширения.

person Kishor K    schedule 21.11.2019
comment
Это помогло мне больше, чем другие ответы. На самом деле выяснилось, что это был OBS, работающий в фоновом режиме, из-за которого мое угловое приложение просто выглядело белым. Я предполагаю, что это как-то связано с рендерингом. Та же проблема в Edge, Chrome и Brave (на основе All Chromium), Firefox, похоже, работал. - person Malcor; 23.01.2021

1.- Открытые теги. Проверьте, правильно ли закрыты теги в html файлах. В моем случае проблема заключалась в том, что в одном компоненте у меня был лишний </div>.

2.- Незаявленные входы. Проверьте, пытаетесь ли вы передать ввод, который не объявлен в компоненте, например <app-component [var1]="123"> </app-component>, в вашем компоненте обязательно должен быть объявлен ввод @Input () var1;

3.- ключи для печати {{}} пустым в каком-то html файле

4.- необъявленные свойства с угловыми тегами. Например, в <input [anyWord]>, где [anyWord] не является допустимой записью

person Lalo19    schedule 10.01.2020

Может быть, вы используете неподдерживаемую версию IE?

Попробуйте Chrome, более поздние версии IE или Firefox и т. Д. В качестве альтернативы вы можете раскомментировать полифиллы браузера в polyfills.ts

/** 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';
person Robin Webb    schedule 01.08.2019

Пожалуйста, проверьте свой 'AuthGuard'. Убедитесь, что он возвращается. Поскольку ваш корень по умолчанию был защищен, и если он возвращает false, я думаю, поэтому ваша страница не загружается.

person Andrew Rayan    schedule 01.08.2019
comment
Я отредактировал вопрос и добавил файл AuthGuard. Можно еще раз проверить код? - person freelancer86; 01.08.2019
comment
Если вам нужно больше кода, просто скажите мне, и я отредактирую вопрос и напишу больше кода - person freelancer86; 01.08.2019

Я столкнулся с той же проблемой, поэтому я просто дважды обновляю страницу, и это работает, но вы можете попробовать это в своих маршрутах, если angular не может найти какие-либо маршруты, которые вы ввели на вас, чтобы перенаправить на PageNotFoundComponent, поэтому создайте компонент PageNotFoundComponent и перенаправьте на этот компонент, потому что вы не обрабатываете все другие маршруты, кроме тех, которые вы указали

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

Или вы можете попробовать это с { useHash: true } в routerConfig, и все маршруты будут использовать #/login, и вы можете использовать это только для режима разработки, и когда вы хотите опубликовать, вы можете удалить эту конфигурацию { useHash: true }

@NgModule({
  imports: [
    ...
    ...
    RouterModule.forRoot(routes, { useHash: true })  // .../#/crisis-center/
  ],
  ...
})
export class AppModule { }
person Stefan Morcodeanu    schedule 01.08.2019
comment
Извините, но я пробовал оба решения, но ни одно из решений не работает - person freelancer86; 01.08.2019
comment
Если вам нужно больше кода, просто скажите мне, и я отредактирую вопрос и напишу больше кода - person freelancer86; 01.08.2019

Проверьте консоль браузера, обычно там отображается ошибка. Если в вашем коде есть ошибка, она будет там показана.

person Emmanuel Aliji    schedule 23.11.2020

В моем случае я просто назвал файл app.routing.ts вместо app-routing.module.ts. Исправив это, это сработало.

person Junaid    schedule 17.12.2020

Проблема с моим кодом заключалась в том, что я использовал объект конфигурации установки 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 /, realm: demo, clientId: local}

person Nag    schedule 06.03.2021

По вашему мнению, не хватает <router-outlet></router-outlet>? (Документация)

person Tobias Reithmeier    schedule 01.08.2019