使用依赖于另一个服务中的服务的管道

Use a pipe which depends on a service in another service

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

感谢您的帮助

您需要注入管道。 如果你自己用 new 创建东西,Angulars DI 没有办法交互。

export class BService {
  constructor(private pPipe:PPipe) {}

这样 Angular 创建一个 PPipe 实例并将依赖项传递给它的构造函数。

正如另一个答案所解释的那样,可以通过将管道公开为提供者(默认情况下它不是提供者)并将其作为任何其他服务注入来解决。这样 AService 将被 Angular 注入器注入 PPipe

手动使用管道 transform 的唯一合适情况是管道是第三方的并且包含仅在管道 class 中可用的有用代码(例如 Angular 内置-在管道中)。

如果管道是第一方的,正确的处理方法是不调用管道 transform,而是直接在 BService 中使用 AService。管道必须重构为尽可能纤细,而 AService 包含重用管道功能所需的所有代码。