Переход к пользовательской странице ошибок - оригинальная страница по-прежнему отображается - PullRequest
0 голосов
/ 04 мая 2018

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

import { ErrorHandler, Injectable, Injector} from '@angular/core';
import { Router } from '@angular/router';

@Injectable()
export class CustomErrorHandler extends ErrorHandler {

    constructor(private injector: Injector) {
     super();
    }
    handleError(error) {
      console.log("Custom error handler.");
      const router = this.injector.get(Router);
    router.navigate(["/error"]);
    throw(error);
    }
  }

Приложение вводит CustomErrorHandler. Однако он не полностью перенаправляет на старую страницу. Вместо этого появляется сообщение об ошибке «страница» (на данный момент просто «ошибка работает») над исходной страницей, которая вызвала ошибку. URL в адресной строке меняет с / ticket на / error, но отображаются как ошибки, так и представления / шаблоны заявок.

enter image description here

Я ссылался на этот вопрос и добавил свой ErrorComponent в массив entryComponents.

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    PageNotFoundComponent
  ],
  entryComponents: [
    ErrorComponent
  ],
  imports: [
    HttpClientModule,
    FlexLayoutModule,
    FormsModule,
    BrowserModule,
    LoadingModule.forRoot({
      animationType: ANIMATION_TYPES.circleSwish,
      backdropBackgroundColour: 'rgba(0,0,0,0.1)',
      backdropBorderRadius: '4px',
      primaryColour: '#ffffff',
      secondaryColour: '#ffffff',
      tertiaryColour: '#ffffff'
    }),
    ReportingModule,
    SharedModule,
    MaterialModule,
    MatNativeDateModule,
    TicketModule,
    NgxResponsiveStackTableModule,
    AppRoutingModule
  ],

  providers: [TicketService, ReportService, UserService,
    httpInterceptorProviders, UploadService, {
      provide: ErrorHandler,
      useClass: CustomErrorHandler
    }],

  bootstrap: [AppComponent]
})
export class AppModule {

  constructor(router: Router) {

  }
}

Это не решило проблему. Шаблон, который я использую для вызова ошибки (для тестирования)

    <h2>Open Tickets</h2>
<div fxLayout="row">
        <mat-form-field>
                <mat-select #sort (change)="sortTickets(sort.value)" placeholder="Sort By.." >
                        <mat-option value="Property">Property</mat-option>
                        <mat-option value="Open">Open Date</mat-option>    
                </mat-select>
        </mat-form-field>
</div>
<div>
        <ngx-loading [show]="isLoading"></ngx-loading>
        <app-ticket-table *ngIf="!isLoading" [tickets]=tickets></app-ticket-table>
</div>

и соответствующий ему TypeScript.

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

  tickets : TicketModel[];
  isLoading :boolean;

  constructor(private ticketService : TicketService) { }

  ngOnInit() {
    this.isLoading = true;
  this.ticketService.getUserTickets().subscribe((res)=> {
    this.tickets = res;
    this.isLoading = false;
  });
  }

У меня есть перехватчик, который отвечает на ошибки Http. Я попытался временно отключить его, если это вызывало проблему, но это не помогло.

export class LoggingInterceptor implements HttpInterceptor {

constructor(private authService: AuthService) {    }

intercept(req: HttpRequest<any>, next: HttpHandler):
    Observable<HttpEvent<any>> {
    return next.handle(req)
        .catch((err: HttpErrorResponse) => {             
            console.log(err);
            return _throw(err.message);
        });

};
}

Маршрутизация для моего приложения проста:

const routes: Routes = [
  {path: "error", component: ErrorComponent},
{  path: '**', component: PageNotFoundComponent}
];

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

и для модуля TicketModule:

const routes: Routes = [{
  path: "ticket",

  canActivate: [UserGuard],
  children: [
    { path: "new", component: TicketAddComponent },
    { path: ":id", component: TicketDetailComponent },
    { path: "", component: TicketComponent }

  ]
}];

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

У меня есть только одна розетка маршрутизатора (в моем корневом компоненте приложения)

  <mat-toolbar>    
            <a class="navbar-brand" href="">
                <img src="../assets/logo.png" />
            </a>
            <span class="fill-space"></span>
            <div  fxHide.lt-md=true  *ngIf="authService.isLoggedIn" >
                    <a mat-button routerLink="/">Home</a>
                    <a mat-button routerLink="/ticket">View Tickets</a>
                    <a mat-button routerLink="/ticket/new">New Ticket</a>
                    <a mat-button routerLink="/report">Reports</a>           
            </div>
    <div fxHide.gt-sm=true  *ngIf="authService.isLoggedIn">

                <mat-menu   #appMenu="matMenu">
                        <a mat-button routerLink="/">Home</a>
                        <a mat-button routerLink="/ticket">View Tickets</a>
                        <a mat-button routerLink="/ticket/new">New Ticket</a>
                        <a mat-button routerLink="/report">Reports</a>     
                      </mat-menu>
                      <button mat-icon-button [matMenuTriggerFor]="appMenu">
                            <mat-icon>more_vert</mat-icon>
                          </button>
    </div>

    </mat-toolbar>
<div id="content" class="container  mat-typography ">
<router-outlet></router-outlet>
</div>

Любой совет будет оценен. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...