在服务A中,我需要使用管道P.这个管道P需要服务B才能工作。到目前为止,我做了类似的事情:
我的P管道定义
export class PPipe implements PipeTransform {
constructor(private aService: AService) {}
transform(value:number) : string {
return number.toString();
}
}
我如何在我的服务B中使用它
@Injectable()
export class BService {
pPipe = new PPipe();
myFn() {
const nbToStr = pPipe.transform(69);
}
}
但是在构建时遇到错误:Expected 1 arguments, but got 0.
。
每次我想使用它时,是否需要传递PPipe实例?如果是这样,它是如何从HTML模板中实现的?
感谢您的帮助
答案 0 :(得分:2)
您需要注入管道。
如果您自己使用new
创建内容,Angulars DI无法进行交互。
export class BService {
constructor(private pPipe:PPipe) {}
这样,Angular会创建一个PPipe
实例,并将依赖项传递给它的构造函数。
答案 1 :(得分:0)
正如另一个答案所解释的那样,可以通过将管道公开为提供者(默认情况下它不是提供者)并将其作为任何其他服务注入来解决。这种方式label.width
将通过Angular注入器注入AService
。
手动使用管道PPipe
的唯一正确情况是管道是第三方并且包含仅在管道类中可用的有用代码(例如Angular内置管道)。
如果管道是第一方管道,处理此问题的正确方法是不调用管道transform
,而是直接在transform
中使用AService
。管道必须重构为尽可能细长,而BService
包含重用管道功能所需的所有代码。