Angular 9: Ошибка NG2003: нет подходящего токена внедрения для параметра 'url' класса 'DataService'. Найденная строка - PullRequest
4 голосов
/ 22 марта 2020

Во время работы с программой я столкнулся с проблемой конструктора и внедрения его зависимостей из дочернего класса.

  • DataService : класс обслуживания, в котором все операции CRUD выполняются в одно место, а также имеет параметризованный конструктор для внедрения URL-адреса конечной точки и HTTP из его дочерних классов.
constructor(private url: string, private http: Http) { }
  • PostService : класс обслуживания, который расширяется вышеупомянутый класс DataService, чтобы иметь функциональность операции CRUD внутри него и однопараметрический конструктор и внутренне вызывает super (endPointURL, httpObject), как показано ниже:
constructor(http: Http) {
    super('https://jsonplaceholder.typicode.com/posts', http);
}

До этого повторного факторинга (перемещение все обычные операции CRUD и расширение его дочерними классами) мой код работал должным образом, но ПОСЛЕ вышеуказанных изменений я получаю следующее сообщение об ошибке:

Date: 2020-03-22T15:26:23.248Z - Hash: 7130497a38c152c58258
5 unchanged chunks

Time: 1859ms

ERROR in src/app/services/data.service.ts:14:23 - error NG2003: No suitable injection token for parameter 'url' of class 'DataService'.
Found string

14   constructor(private url: string, private http: Http) { }

Кроме того, когда я удаляю параметр url из конструктора источника данных (соответственно измените PostService.ts) API работает должным образом. Не уверен почему !!!

Я использую:

Angular CLI: 9.0.4 Узел: 12.16.1 ОС: win32 x64

Angular: ... Ivy Workspace:

Версия пакета

@ angular -devkit / architect 0.900.4

@ angular -devkit / core 9.0.4

@ angular -devkit / schematics 9.0.4

@ schematics / angular 9.0.4

@ schematics / update 0.900.4

rx js 6.5.3

DataService.ts

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { AppError } from '../common/app-error';
import { NotFoundError } from '../common/not-found-error';
import { BadInput } from '../common/bad-input';

@Injectable()
export class DataService {

//   private url = 'https://jsonplaceholder.typicode.com/posts';

  constructor(private url: string, private http: Http) { }

  getAll() {
    return this.http.get(this.url).pipe(catchError(this.errorHandle));
  } 

  create(resource) {
    return this.http.post(this.url, JSON.stringify(resource))
      .pipe(catchError(this.errorHandle));
  }

  update(resource) {
    return this.http.patch(this.url + '/' + resource.id, JSON.stringify({ isRead: true }))
    .pipe(catchError(this.errorHandle));
  }

  delete(resource) {
    return this.http.delete(this.url + '/' + resource.id)
      .pipe(catchError(this.errorHandle));
  }

  private errorHandle(error: Response){
    if (error.status === 404) {
      return throwError(new NotFoundError());
    }
    if (error.status === 400) {
      return throwError(new BadInput(error.json()));
    }
    return throwError(new AppError(error));
  }

}

PostService.ts

import { Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { DataService } from './data.service';

@Injectable()
export class PostService extends DataService {

  constructor(http: Http) {
    super('https://jsonplaceholder.typicode.com/posts', http);
  }

}

Ответы [ 3 ]

8 голосов
/ 25 марта 2020

In DataService.ts :

Обновление конструктора

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

constructor(@Inject(String) private url: string, private http: Http)
2 голосов
/ 01 апреля 2020

удалить @Injectable () из DataService.ts

1 голос
/ 07 апреля 2020

Поскольку я сам сталкиваюсь с той же ошибкой, с той же нотацией, я полагаю, вы смотрели курс 'Mo sh' angular, который принадлежал версии 4.

С тех пор произошло несколько изменений, один из них заменяет Http на HttpClient, другой - огромные изменения в библиотеке rx js, разумеется, то же самое произошло с сервисами. Теперь вместо того, чтобы переводить свои сервисы в провайдеров, вы используете метод @Injectable, который, на мой взгляд, более чище и более связанных с самой службой.

Однако, если вы внимательно следите за реализацией, вы заметите, что DataService - это просто базовый класс, и он никогда не будет использоваться как сама служба. Это похоже на манифест. не нужно вводить или предоставлять в модуле приложения. Если вы помните, «Mo sh» никогда не предоставлял его в модуле приложения. Единственным сервисом, который был предоставлен, был PostService. Вот почему вы должны удалить украшение @Injectable из DataService.

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