【问题标题】:Is it possible to use a pipe in the code?是否可以在代码中使用管道?
【发布时间】:2016-02-02 16:44:30
【问题描述】:

当我在模板中使用我的自定义管道时,它是这样的:

{{user|userName}}

而且效果很好。

是否可以在代码中使用管道?

我尝试这样使用它:

let name = `${user|userName}`;

但它显示

用户名未定义

我的替代方法是在代码中手动使用db.collection.findOne()。但是有什么聪明的办法吗?

【问题讨论】:

  • 你不能使用这样的模板,你必须将管道注入你的构造器
  • 对不起,我会说清楚的。我已经注入管道
  • 您尝试在代码中使用哪个管道?这是您的自定义管道吗?
  • 我不认为你可以,因为 ... 不是由 Angular 执行的。这是 ES6 字符串插值...

标签: angular angular-pipe


【解决方案1】:

首先在模块的providers 中声明管道:

import { YourPipeComponentName } from 'your_component_path';

@NgModule({
  providers: [
    YourPipeComponentName
  ]
})
export class YourServiceModule {
}

然后你可以在这样的组件中使用@Pipe

import { YourPipeComponentName } from 'your_component_path';

class YourService {

  constructor(private pipe: YourPipeComponentName) {}

  YourFunction(value) {
    this.pipe.transform(value, 'pipeFilter');
  }
}

【讨论】:

  • 看起来不错!但是由于某种原因,依赖注入无法将我的管道注入到构造函数中,即使它可以在 html 中毫无问题地使用。它在另一个模块中声明和导出,也许它也需要在提供者列表中?但是,创建和使用 MyPipe 的新实例确实有效。只有 DI 有问题……
  • @Sam 确实需要在providers 中。将YouPipeComponentName 添加到您的providers,此方法将完美运行。
  • 还要确保将其添加到正确的提供程序。如果要全局使用管道,请将其放在 app.module 提供程序中。如果你只想在一些延迟加载的模块中使用它,请将其放在各自模块的提供程序中
  • 导入路径错误。在@angular/common 下无法使用管道
  • @Andris 我已经编辑过了。那是一个错误。我的意思是你必须导入你的管道模块。
【解决方案2】:

@Siva 是正确的。谢谢!

所以在组件中使用管道的方式是这样的:

let name = new UserNamePipe().transform(user);

Link 另一个类似的问题。

【讨论】:

  • 这行得通,但它可能没有遵循 Angular 最佳实践/首选模式。如另一个答案所示,将管道作为组件依赖项传递给构造函数是“更正确的”。
  • 使用这种方式没有性能问题吗?有些人可能会一直使用它!
  • 这是一种完全错误的管道使用方式。管道是一个特殊 用途的类,应该通过 Angular 提供的特殊方式来使用。如果您需要在管道中实现某些功能,但以像常规 TypeScript 类一样的方式使用它,那么您必须创建 regular 类并在您的 TS 代码中使用它(例如,your-component.ts)。如果您需要管道中的相同功能,您也可以随时使用管道中的 regular 类。
  • 最大的不同是你用这种方式创建了更多的类实例。使用 Angular 语法,它的行为就像一个单例,并且只被实例化一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多