как исправить "Не удается разрешить все параметры для DynamicDatabase: (?)." - PullRequest
0 голосов
/ 06 января 2019

Я пытаюсь добавить компонент в свой проект - "Пример динамического дерева" Вы можете видеть это здесь: https://stackblitz.com/angular/eaaramngjoqq?file=app%2Ftree-dynamic-example.ts

прямо сейчас, если вы зайдете на этот сайт и добавите новый сервис, подобный этому:

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

@Injectable()
export class NewService {

  constructor() { }

}

, а затем перейдите в tree-dynamic-example.ts и добавьте эту строку (конструктор (частный newService: NewService) {} ) вот так:

export class DynamicDatabase {

constructor(private newService: NewService){}

dataMap = new Map<string, string[]>([
    ['Fruits', ['Apple', 'Orange', 'Banana']],
    ['Vegetables', ['Tomato', 'Potato', 'Onion']],
    ['Apple', ['Fuji', 'Macintosh']],
    ['Onion', ['Yellow', 'White', 'Purple']]
  ]);

он скажет вам: Не удается разрешить все параметры для DynamicDatabase: (?).

Я проверил вопросы по этой теме, и они не помогли - Я не забыл написать @ или () в @injectable () Я добавил app.module.ts эту строку в свой проект:

@NgModule
.
.
providers: [NewService] 

но я продолжаю получать эту ошибку.

p.s. Я немного новичок в угловой, так что, может быть, я забыл что-то простое, буду благодарен за помощь

1 Ответ

0 голосов
/ 06 января 2019

Похоже, что эта проблема напрямую связана с тем, что вы пытаетесь внедрить сервис в класс, в то время как он должен быть внедрен в компонент или директиву. Это работает, если вы поместите его в класс с декоратором https://stackblitz.com/edit/angular-a6m76r?file=app/tree-dynamic-example.ts

Однако, если вам нужен сервис внутри простого класса, вы можете создать экземпляр сервиса вручную (отметьте ser в первом классе). Когда вы используете constructor(private service: Service) Angular создает для вас экземпляр этой службы (или использует глобальный, если вы используете @Injectable({provideIn:'root'}).

Сервис - это просто класс с декоратором, который помогает Angular разрешать DI (Dependency Injection). Таким образом, использование в классе требует от вас создания экземпляра этой службы вручную, если вы не хотите использовать статические методы.


TL; DR;

1 кейс - вам требуется обслуживание компонента

@Component(...)
export class Component {
  constructor (private service: Service) }
}

Angular создает экземпляр сервиса для вас через DI.

2 кейс - вы хотите использовать услугу в классе

export class BaseClass {
  private service;

  constructor() {
    this.service = new Service();
  }
}

Не существует декораторов, поэтому Angular не может разрешить для нас DI, поэтому мы создаем экземпляр сервиса в конструкторе (как если бы мы работали с традиционным классом, которым на самом деле является сервис).

...