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'。
或者如果您不提供此值,只需删除第二个参数。
我正在尝试对我的应用程序中的某些组件和服务进行泛化和参数化,以便为通用部分节省时间和代码。
有了这些组件,我很容易就成功继承了;但是当对服务尝试相同的操作时,我失败了。有人可以帮我看看我的错误吗?
我的 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'。
或者如果您不提供此值,只需删除第二个参数。