אנגולר - Angular2 הפניה לדף שגיאה מותאם


ממשתי את מנהל השגיאות המותאם שלי, ובתוכו אני רוצה להפנות לדף השגיאה המותאם שלי שאומר פשוט 'מצטערים, אירעה שגיאה......'.

הכרזתי על נתיב תחת הקובץ app-routing.module.ts שלי כך:

import { NgModule } from '@angular/core';
import { PreloadAllModules, Routes, RouterModule } from '@angular/router';

import { NoContentComponent } from './no-content/no-content.component'
import { CustomErrorComponent } from './customerror/customerror.component';

const routes: Routes = [
    { path: '',   redirectTo: '/home', pathMatch: 'full' },
    { path: 'resources',  loadChildren: 'app/educational-materials/educational-materials.module#EducationalMaterialsModule' },
    { path: 'administrative',  loadChildren: 'app/dsc/dsc.module#DSCModule' },
    { path: 'ask-a-question',  loadChildren: 'app/aaq/aaq.module#AAQModule' },
    { path: '**', pathMatch: 'full', component: NoContentComponent },
    { path: 'error', component: CustomErrorComponent }
];

@NgModule({
    imports: [RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })],
    exports: [RouterModule],
    providers: []
})

export class AppRoutingModule { }

ובמנהל החריגות הגלובלי שלי, יישמתי את זה:

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

@Injectable()

export class GlobalExceptionErrorHandler implements ErrorHandler {
    private router: Router;

    constructor(injector: Injector) {
        setTimeout(() => this.router = injector.get(Router));
    }

    handleError(error) {
        console.log('globalExceptionHandler | handleError...');

        this.router.navigate(['/error']);
    }
}

בקובץ הזה, כשאני שמים את הסלאש קדימה מול error, זה ממקם מחדש לכתובת /error, אבל אומר שהדף 404 חסר. (ברור שזה לא הלך לדף CustomErrorComponent שלי).

אם אני מסיר את הסלש הקדמי מ-this.router.navigate(['error']), אז זה לא עושה כלום.

איך אני גורם לזה לקרוא ל-CustomErrorComponent שהגדרתי בקובץ app-routing.module.ts שלי?

עריכה :

הנה הרכיב CustomErrorComponent:

import { OnInit } from '@angular/core';

export class CustomErrorComponent implements OnInit {
    constructor() { }

    ngOnInit() {
    }
}

וה-HTML עבור העמוד הזה:

<div class="container">
    <div class="row">
        <div class="col-xs-12">
            <h3>Sorry, an error occurred processing your request. The error has been logged.</h3>
        </div>
    </div>
</div>

עריכה 2: האם ייתכן שהנתיב לא מוגדר במקום הנכון? אני מניח שהנתיב צריך להיות מוגדר "בשורש", אבל הוא מתנהג כאילו אינו קיים (ולכן לא מבצע הפנייה).

עריכה 3: כשציינתי בתגובות שזה פוגע בפונקציה שלי handleError 20 פעמים, לא הפנתי את השגיאה... טוב, הפעלתי את זה ותראה מה מופיע עכשיו (זה קורה כאשר ל-this.router.navigate(['/error']) שלי יש את הסלאש הקדמי):

לא נמצא מפעל רכיבים עבור CustomErrorComponent. האם הוספת אותו ל-@NgModule.entryComponents

אז לאחר מכן, הוספתי את זה לקובץ CustomErrorComponent שלי:

import { OnInit, Component } from '@angular/core';

@Component({
    entryComponents: [CustomErrorComponent]
})

export class CustomErrorComponent implements OnInit {
    constructor() { }

    ngOnInit() {
        console.log('customErrorComponent | ngOnInit...');
    }
}

עכשיו אני מקבל את זה ברגע שאני טוען את האפליקציה:

הרכיב CustomErrorComponent אינו חלק מכל NgModule או שהמודול לא יובא למודול שלך

כל מקום שבו ניסיתי להוסיף את ה-CustomErrorComponent נכשל. איפה אני צריך לרשום את הקומפוננט שלי?

תשובה #1

הבעיה העיקרית היא שהמשתנה routes מ-app-routing.module.ts מכיל את הקלט ל-** לפני הקלט ל-error והנתב תמיד ילך ל-**.

העברת הערך ** למקום האחרון בתוך routes תאפשר להגיע לערך error.

כמו כן מצאנו שלאחר העדכונים הדקורטור @Component({}) של CustomErrorComponent הוסר.

בואו נחזיר את זה שוב ונשאיר את קובץ CustomErrorComponent עם הקוד הזה:

import { OnInit, Component } from '@angular/core';

@Component({
    selector: "customErrorComponent",
    templateUrl: './customerror.component.html'
})

export class CustomErrorComponent implements OnInit {
    constructor() { }

    ngOnInit() {
        console.log('customErrorComponent | ngOnInit...');
    }
}

בנוסף, עלינו להוסיף את CustomErrorComponent ל-entryComponents של המודול הראשי שלך.

פשוט הוסף entryComponents: [CustomErrorComponent] למודול הראשי שלך.

זה עשה את העבודה, הקוראים העתידיים יכולים לבדוק את שרשור השיחה של השאלה למידע נוסף.