Угловой 5: не удается разрешить все параметры для e: (?) - PullRequest
0 голосов
/ 13 июня 2018

Я использую angular-cli с Angular 5. Я пытаюсь создать службу, которая сама использует другую службу.

Однако я получаю чередующиеся ошибки «Не удается разрешить все параметры для [наименование услуги]: (?)."и "Не удается разрешить все параметры для e: (?,?,?,?)."

Вот мои настройки:

MyLoggerService

import { Injectable, Inject, forwardRef } from "@angular/core";
import { OtherLoggerService } from "@A/AServices";
// OtherLoggerService is from a package I installed via npm, so I won't include it here.

// I thought I was missing this @Injectable decorator, but adding it to my
//code gives me the e: (?, ?, ?, ?) error
//Without this @Injectable() line, I get the MyLoggerService: (?) error.
@Injectable() 
export class DMLoggerService extends {
    constructor(
        @Inject(forwardRef(() => OtherLoggerService)) private otherLoggerService: OtherLoggerService
    ) { }

    public logEvent(): void {
        this.otherLoggerService.logEvent();
    }
    public trackPageView(): void {
        this.otherLoggerService.trackPageView();
    }
}

MyComponent

import { Component, Inject, forwardRef} from "@angular/core";
import { OtherLoggerService} from "@A/AServices";
import { MyLoggerService } from "../../common/services/mylogger.service";
import { AnotherService } from "@A/AServices";

@Component({
    selector: "my-component",
    templateUrl: "./my-component.component.html"
})
export class MyComponent{
    constructor(
        @Inject(forwardRef(() => MyLoggerService)) private myLoggerService: MyLoggerService,
        private anotherService: AnotherService
    ) {
        this.myLoggerService.trackPageView();
        this.anotherService.someFunc();
    }
}

MyModule

import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { CommonModule } from "@angular/common";
import { OtherLoggerService} from "@A/AServices"; // Just added this per comments, but still receive the same errors
import { MyLoggerService } from "../../common/services/mylogger.service";
import { AnotherService } from "@A/AServices";

@NgModule({
    imports: [
        CommonModule
        BrowserModule
    ],
    declarations: [],
    providers: [OtherLoggerService, MyLoggerService, AnotherService]
    // Added OtherLoggerService to this array but still received errors
})
export class MyModule { }

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

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

IЯ видел похожие темы, но еще не нашел ни одного рабочего решения.

Редактировать: «OtherLoggerService» и «AnotherService» - это сервисы, полученные из пакета, который я установил с помощью npm, поэтому я не буду публиковать ихсодержание здесь.Тем не менее, если есть что-то, чему я могу научиться или что нужно иметь в виду в результате их использования, пожалуйста, поделитесь своими комментариями.

Редактировать: Добавлен импорт для OtherLoggerService на MyModule, но он все еще получаетошибки.

Редактировать: Попытка добавления OtherLoggerService в массив провайдеров на MyModule, все еще получая ошибки.

1 Ответ

0 голосов
/ 13 июня 2018

Я понял это!

Аналогично ответам и комментариям на этот вопрос: Ошибка углового цифрового входа - ИСКЛЮЧЕНИЕ: не удается разрешить все параметры

этокажется, я создал циклическую зависимость в своем коде с различными сервисами, которые я включил в мой массив providers для MyModule.

Служба, которую я называю AnotherService, которую я импортирую из @A/AServices, фактически включена в моем случае на уровне корневого модуля, в файл, который я лично не писал и не просматривал в этом случае.( В моем случае все службы из @A/AServices были включены в корневой модуль. ) Чтобы решить мою проблему, я просто удалил AnotherService из моего providers массива.

Точно так же мне не нужно было включать OtherLoggerService, поскольку он также является частью @A/AServices.

Даже если я удалил их из массива providers на уровне модуля, а также удалилоператоры импорта в MyModule, я все еще мог использовать их в MyComponent, и все еще нужно было импортировать их в MyComponent, как обычно.

Вот мой обновленный код:

MyLoggerService (без изменений)

import { Injectable, Inject, forwardRef } from "@angular/core";
import { OtherLoggerService } from "@A/AServices";

@Injectable() 
export class DMLoggerService extends {
    constructor(
        @Inject(forwardRef(() => OtherLoggerService)) private otherLoggerService: OtherLoggerService
    ) { }

    public logEvent(): void {
        this.otherLoggerService.logEvent();
    }
    public trackPageView(): void {
        this.otherLoggerService.trackPageView();
    }
}

MyComponent (удален OtherLoggerService импорт, поскольку я внедряю его в MyLoggerService, поэтому он уже включен в MyLoggerService import)

import { Component, Inject, forwardRef} from "@angular/core";
import { AnotherService} from "@A/AServices";
import { MyLoggerService } from "../../common/services/mylogger.service";

@Component({
    selector: "my-component",
    templateUrl: "./my-component.component.html"
})
export class MyComponent{
    constructor(
        private myLoggerService: MyLoggerService,
        @Inject(forwardRef(() => AnotherService)) private anotherService: AnotherService
    ) {
        this.myLoggerService.trackPageView();
        this.anotherService.someFunc();
    }
}

MyModule (удалены ссылки на AnotherService и OtherLoggerService, поскольку они включены в корневой модуль. Также внесены небольшие изменения в атрибуты @NgModule)

import { NgModule } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { CommonModule } from "@angular/common";
import { MyLoggerService } from "../../common/services/mylogger.service";

@NgModule({
    imports: [
        CommonModule
        BrowserModule
    ],
    declarations: [MyComponent],
    providers: [MyLoggerService], // removed the services here that were causing the circular dependency
    exports: [MyComponent]
})
export class MyModule { }

Я также хотел бы отметить для любых будущих читателей, что я использовал @Inject(forwardRef(() => ServiceName)) при описании параграфа.счетчики в constructor как MyLoggerService, так и MyComponent обусловлены техническими требованиями к службам, которые я использую из пакета npm @A/AServices, и для любых служб, которые я создаю сам, я не делаюнужно использовать этот метод forwardRef, когда я включаю сервис в конструктор.

...