Сервис Наследие в Angular 5+ - PullRequest
0 голосов
/ 08 мая 2018

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

С компонентами я легко справился с наследованием; но при попытке того же маневра с сервисами у меня не получается. Может ли кто-нибудь помочь мне увидеть мою ошибку?

Мой ParentService его:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';

import { URL } from '../constants';

@Injectable()
export class GlobalService {

constructor(public http: HttpClient, public name:string='category') {

}

returnData(url){
 return this.http.get(url);
}

getList():Observable<any>{
 var url = URL+'/'+this.name+'/list';
 console.log("-> URL: "+url);
 return this.returnData(url);
}

}

Мой SonService это так:

import { Injectable } from '@angular/core'; 
import { HttpClient } from '@angular/common/http';
import { GlobalService } from './global.service';

@Injectable()
export class ActorService extends GlobalService{ 

  constructor (public http: HttpClient){
    super(http, 'actor');
  }
}

Я импортировал все в app.module.ts и включил провайдеров un (первый - globalService).

Ошибка, которая у меня есть в "ng build --prod":

ERROR in : Can't resolve all parameters for GlobalService in myDirectoryPath/global.service.ts: ([object Object], ?).

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

При импорте этой службы вы должны указать значение второго параметра - атрибута «имя». Вот что здесь объясняется: ([объект Объект],?)

Взгляните на официальный документ, где объясняется DI . Вероятно, вам нужно использовать useValue при предоставлении этой услуги.

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

0 голосов
/ 08 мая 2018

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

Если это ваш случай, вы должны удалить @Injectable() декоратор из вашего GlobalService. То, что это делает, это говорит angular попытаться внедрить все в его конструкторе. Angular знает, как ввести http, но не знает, как ввести name. Итак, если вы удалите @Injectable(), angular проигнорирует этот сервис. Ваши другие сервисы будут вставлять http в свой конструктор (как вы показали в своем коде) и передавать его в GlobalService.

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