2

У меня есть обработчик исключений, как это, в котором я пытаюсь внедрить услугу (ErrorReportingService)Angular2 - Как внедрить услугу в обработчик исключений

import { ExceptionHandler, Injectable } from '@angular/core'; 
import {ErrorReportingService } from '../services/ErrorReportingService'; 

@Injectable() 
export class InsightsExceptionHandler extends ExceptionHandler { 
    constructor(private _errorReporter: ErrorReportingService) { 
     super(null, null); 
    } 

call(error, stackTrace = null, reason = null) { 
    this._errorReporter.logError(error); 

    } 
} 

Служба Пытаюсь для ввода выглядит так:

import { Http, Response } from '@angular/http'; 
import { Injectable, Inject } from '@angular/core'; 

@Injectable() 
export class ErrorReportingService { 
    private ErrorReportingUrl = `/property/insights/api/errorreporting`; 
    constructor(private _http: Http) { } 

    logError(error: any) { 
     var body = JSON.stringify(error); 
     this._http.post(this.ErrorReportingUrl, body, null); 
    } 
} 

Служба ErrorReportingService зарегистрирована у поставщиков компонента приложения.

Я также пробовал инъекционные услугу по-разному, как это:

export class InsightsExceptionHandler extends ExceptionHandler { 
    private _errorReporter: ErrorReportingService; 
    constructor(@Inject(ErrorReportingService) errorReporter: ErrorReportingService) { 
     super(null, null); 
     this._errorReporter = errorReporter; 
    } 
...... 

Я получаю эту ошибку при попытке запустить приложение:

Error: (SystemJS) EXCEPTION: Error during instantiation of ApplicationRef_! (ApplicationRef -> ApplicationRef_). 
ORIGINAL EXCEPTION: No provider for ErrorReportingService! (ExceptionHandler -> ErrorReportingService) 
ORIGINAL STACKTRACE: 
Error: DI Exception 

ответ

3

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

Добавьте все услуги, которые вам нужны в самом бутстрап-провайдере,

bootstrap(
<YourAppComponent>, 
[ 
    // inject all the services which you need here 
    // so that they can be injected wherever required 

    ErrorReportingService, 
    provide(ExceptionHandler, { 
     useClass: InsightsExceptionHandler 
    }) 
]).catch(err => console.error(err)); 

Надеюсь, это поможет!

+0

Спасибо, это сработало. Хотя я не понимаю, почему я должен предоставить их в вызове bootstrap, поскольку они уже находятся в поставщиках компонента App? –

+1

Мы переопределяем Angular ExceptionHandler по умолчанию, зарегистрировав поставщика для этого в бутстрапе, и Angular принимает решение, когда создавать службу на основе того, где она зарегистрирована, поэтому в этом случае при загрузке, поэтому он будет искать всю зависимость от на том же уровне, хотя вы, возможно, добавили провайдера ErrorReportingService в компонент приложения, который создаст новый экземпляр компонента ErrorReportingService for App или детей. Надеюсь это поможет!! –

0

Чтобы разорвать цикл использование

@Injectable() 
export class ErrorReportingService { 
    constructor(injector:Injector) { 
    setTimeout(() { 
     this.appRef = injector.get(ApplicationRef); 
    }); 
    } 
} 

Я не знаю, если это именно то, что вызывает цикл, потому что ваш вопрос не содержит ErrorReportingService источника, но вы должны получить идею.

+0

Спасибо, я попробовал это, но это не сработало для меня - такая же ошибка. Источником Службы является вопрос. –

+0

О, как-то я пропустил это. Вероятно, существует некоторая косвенная зависимость от 'ApplicationRef'. Попробуйте ввести «Http» так, как я сделал с «ApplicationRef» в своем ответе. –

+0

Вот что я пробовал. Интересно, изменилось ли что-то по-угловому, как я читал, и попробовал, как вы предлагали ранее, у меня всегда была ошибка, упомянутая в вопросе. –

Смежные вопросы