Нет провайдера для CustomPipe - угловой 4

У меня есть собственный формат десятичного формата, который использует угловую десятичную трубку. Этот канал является частью общего модуля. Я использую это в функциональном модуле и не получаю ошибку провайдера при запуске приложения.

Пожалуйста, игнорируйте, если есть опечатка.

./src/pipes/custom.pipe.ts

import { DecimalPipe } from '@angular/common';
..
@Pipe({
    name: 'customDecimalPipe'
})
...
export class CustomPipe {
constructor(public decimalPipe: DecimalPipe) {}
transform(value: any, format: any) {
    ...
}

./modules/shared.module.ts

import  { CustomPipe } from '../pipes/custom.pipe';

...

@NgModule({
  imports:      [ .. ],
  declarations: [ CustomPipe ],
  exports:    [ CustomPipe ]
})
export class SharedModule { }

Я ввожу пользовательский канал в один из компонентов и метод преобразования вызова, чтобы получить преобразованные значения. Общий модуль импортируется в его функциональный модуль.

Ответ 1

Если вы хотите использовать метод pipe transform() в компоненте, вам также нужно добавить CustomPipe к поставщикам модулей:

import  { CustomPipe } from '../pipes/custom.pipe';

...

@NgModule({
  imports:      [ .. ],
  declarations: [ CustomPipe ],
  exports:    [ CustomPipe ],
  providers:    [ CustomPipe ]
})
export class SharedModule { }

Ответ 2

Помимо добавления CustomPipe в список поставщиков модулей, альтернативой является добавление к поставщикам компонентов. Это может быть полезно, если ваш собственный канал используется только в нескольких компонентах.

import  { CustomPipe } from '../pipes/custom.pipe';
...
@Component({
    templateUrl: './some.component.html',
    ...
    providers: [CustomPipe]
})
export class SomeComponent{
    ...
}

Надеюсь это поможет.

Ответ 3

Вы также можете сделать канал Injectable (так же, как это делается с сервисами, которые вы создаете с помощью cli):

    import { Injectable, Pipe, PipeTransform } from '@angular/core';

    @Pipe({
      name: 'customDecimalPipe'
    })
    @Injectable({
      providedIn: 'root'
    })
    export class CustomPipe extends PipeTransform {
      ...
    }