我使用Angular:7.2.10,当我尝试使用命令构建生产项目时:
ng b --prod
我有错误
ERROR in : Can't resolve all parameters for ApiService in ...
我为带有3个参数的构造函数提供服务:
constructor(api: string, private _http: HttpClient, private httpUtils: HttpUtilsService) {
this.api = `${api}/api`;
}
通过在app.module.ts上定义的工厂实例化:
{
provide: ApiService,
useFactory: apiHost,
deps: [Store, HttpClient, HttpUtilsService]
}
apiHost
export function apiHost(store: Store<RemoteConfig>, http: HttpClient, httpUtils: HttpUtilsService) {
let item: string = localStorage.getItem(environment.apiHost);
//store.pipe(select(backendApiHost), take(1)).subscribe(api => item = api); // Todo not always read val!
//console.log('ss: ' + item);
return new ApiService(item, http, httpUtils);
}
当我使用ng build
它成功。
通过检查编译器发出的元数据可以隐式解决依赖关系。此元数据从参数的类型派生。
在运行时,角度喷射器检查该信息以确定要喷射的依赖项。具体来说,它为每个对应的参数寻找注册的提供程序。
由于尚未注册映射到为类型参数发出的元数据的提供程序,string
因此查找失败,并且会收到错误消息。您可以为该类型注册一个提供程序,但鉴于使用的字符串有多广泛,这样做是不明智的。
但是,Angular的依赖项注入工具不限于此隐式解决方案。使用Inject
decorator和InjectionToken
s的组合,可以实现您想要的。
api-token.ts
import {InjectionToken} from '@angular/core';
export const apiToken = new InjectionToken('api', {
providedIn: 'root',
value: 'myapi'
});
现在,您可以使用此令牌请求为特定参数解决此依赖关系。
数据服务
import {Inject, Injectable} from '@angular/core';
import {apiToken} from './api-token';
@Injectable({providedIn: 'root'})
export class DataService {
constructor(@Inject(apiToken) api: string) {}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句