Angular 中的服务传承 5+

Service Heritage in Angular 5+

我正在尝试对我的应用程序中的某些组件和服务进行泛化和参数化,以便为通用部分节省时间和代码。

有了这些组件,我很容易就成功继承了;但是当对服务尝试相同的操作时,我失败了。有人可以帮我看看我的错误吗?

我的 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 中导入了所有内容,并包括了未提供者(第一个是 globalService)。

我在 "ng build --prod" 中遇到的错误是:

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

我假设您想实现某种通用服务,该服务在您的其他服务中包含一些共享逻辑。我还假设您不会在应用程序的任何部分注入此 GlobalService,而只是扩展此部分的部分。

如果是这种情况,您应该从 GlobalService 中删除 @Injectable() 装饰器。它的作用是告诉 angular 尝试在其构造函数中注入所有内容。 Angular知道如何注入http,但不知道如何注入name。因此,如果您删除 @Injectable(),angular 将忽略此服务。您的其他服务将在其构造函数中注入 http(如您在代码中所示)并将其传递给 GlobalService

导入此服务时,您必须为第二个参数 "name" 属性提供一个值。 这就是这里要解释的内容:([object Object], ?)

看看official doc, where the DI is explained。 您可能需要的是在提供此服务时使用 'useValue'。

或者如果您不提供此值,只需删除第二个参数。