使用依赖于其他服务中的服务的管道

时间:2017-12-06 11:04:51

标签: angular dependency-injection angular-services angular-pipe

在服务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模板中实现的?

感谢您的帮助

2 个答案:

答案 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包含重用管道功能所需的所有代码。