Angular2: custom pipe could not be found

131,334

Solution 1

see this is working for me.

ActStatus.pipe.ts First this is my pipe

    import {Pipe,PipeTransform} from "@angular/core";
    
    @Pipe({
      name:'actStatusPipe'
    })
    export class ActStatusPipe implements PipeTransform{
      transform(status:any):any{
        switch (status) {
          case 1:
            return "UN_PUBLISH";
          case 2:
            return "PUBLISH";
          default:
            return status
        }
      }
    }

main-pipe.module.ts in pipe module, i need to declare my pipe/s and export it.

    import { NgModule } from '@angular/core';
    import {CommonModule} from "@angular/common";
    
    import {ActStatusPipe} from "./ActStatusPipe.pipe"; // <---
    
    @NgModule({
      declarations:[ActStatusPipe], // <---
      imports:[CommonModule],
      exports:[ActStatusPipe] // <---
    })
    
    export class MainPipe{}

app.module.ts user this pipe module in any module.

    @NgModule({
      declarations: [...],
      imports: [..., MainPipe], // <---
      providers: [...],
      bootstrap: [AppComponent]
    })

you can directly user pipe in this module. but if you feel that your pipe is used with in more than one component i suggest you to follow my approach.

  1. create pipe .
  2. create separate module and declare and export one or more pipe.
  3. user that pipe module.

How to use pipe totally depends on your project complexity and requirement. you might have just one pipe which used only once in the whole project. in that case you can directly use it without creating a pipe/s module (module approach).

Solution 2

This didnt worked for me. (Im with Angular 2.1.2). I had NOT to import MainPipeModule in app.module.ts and importe it instead in the module where the component Im using the pipe is imported too.

Looks like if your component is declared and imported in a different module, you need to include your PipeModule in that module too.

Solution 3

A really dumb answer (I'll vote myself down in a minute), but this worked for me:

After adding your pipe, if you're still getting the errors and are running your Angular site using "ng serve", stop it... then start it up again.

For me, none of the other suggestions worked, but simply stopping, then restarting "ng serve" was enough to make the error go away.

Strange.

Solution 4

I take no issue with the accepted answer as it certainly helped me. However, after implementing it, I still got the same error.

Turns out this was because I was calling the pipes incorrectly in my component as well:

My custom-pipe.ts file:

@Pipe({ name: 'doSomething' })
export class doSomethingPipe implements PipeTransform {
    transform(input: string): string {
        // Do something
    }
}

So far, so good, but in my component.html file I was calling the pipes as follows:

{{ myData | doSomethingPipe }}

This will again throw the error that the pipe is not found. This is because Angular looks up the pipes by the name defined in the Pipe decorator. So in my example, the pipe should instead be called like this:

{{ myData | doSomething }}

Silly mistake, but it cost me a fair amount of time. Hope this helps!

Solution 5

import {CommonModule} from "@angular/common";

Adding this statement to the pipe module solved my problem.

Share:
131,334
rui
Author by

rui

Updated on January 21, 2022

Comments

  • rui
    rui over 2 years

    The built-in pipe is work,but all custom pipes that i wanna use are the same error:

    the pipe 'actStatusPipe' could not be found

    [ERROR ->]{{data.actStatus | actStatusPipe}}

    I have tried two ways,declare it in app.module's declarations:

    app.module.ts:

    import {ActStatusPipe} from '../pipe/actPipe'
    
    @NgModule({
        declarations: [
            AppComponent,
            HomePage,
            ActivitiesList,
            ActStatusPipe
        ],
        ...
    })
    

    or use other module to declare and export all my pipes: //pipe

    import {ActStatusPipe} from "./actPipe"
    
    @NgModule({
        declarations:[ActStatusPipe],
        imports:[CommonModule],
        exports:[ActStatusPipe]
    })
    
    export class MainPipe{}
    

    and import it in app.module.

    //pipe
    import {MainPipe} from '../pipe/pipe.module'
        
    @NgModule({
        declarations:[...],
        imports:[...,MainPipe],
    })
    

    But none of them work in my app.

    Here is my code of the pipe:

    import {Pipe,PipeTransform} from "@angular/core";
    
    @Pipe({
        name:'actStatusPipe'
    })
    export class ActStatusPipe implements PipeTransform{
        transform(status:any):any{
            switch (status) {
                case 1:
                    return "UN_PUBLISH";
                case 2:
                    return "PUBLISH";
                default:
                    return status
            }
        }
    }
    

    I think it is most of the same with the document(In fact,i have just copied from the document and made a little modification)

    And my angular2's version is 2.1.

    Lots of solution that can be searched in stackOverflow and google are tried in my app,however they don't work.

    This confused me a lot,thanks for you answer!

  • rui
    rui over 7 years
    Finally i find out it is because i import the pipe at the root module,and use it in a component import by other module.I just think it will work globally before and the bug is caused by my pipe. Your answer inspire me to find out this,thanks for your help!
  • Phil
    Phil almost 7 years
    What? That makes no sense. There isn't a global import for something like this?
  • Shashank Gaurav
    Shashank Gaurav over 6 years
    @rui Your comment saved my day.. I was also having same issue.. hahaha
  • SeanMC
    SeanMC about 6 years
    but what if you need to import it in 2 modules? I find that doesn't work. I get a console error saying to use it in a higher module instead of 2 modules, but then app module doesn't do the trick
  • GBarroso
    GBarroso about 6 years
    @rui same as above, your comment saved me
  • Rhyous
    Rhyous almost 6 years
    @Rui, can you be more clear about how you solved this.
  • ykadaru
    ykadaru about 5 years
    Adding a pipe to its own module is not required - it's just an alternative. The official docs (angular.io/guide/pipes#custom-pipes) says Pipes have to be declared and provided, so it can be injectible.
  • Vinay Pandya
    Vinay Pandya about 5 years
    i think that what happening here, i am declaring ActStatusPipe in MainPipe module (which may have multiple pipes), and than importing that MainPipe module, so i can use all of the pipes.
  • Vinay Pandya
    Vinay Pandya about 5 years
    that alternate ans is also mentioned in my answer.
  • Vinay Pandya
    Vinay Pandya about 5 years
    yes that is the way angular works, but if you want use that pipe module through out your angular app you can import in app.module.ts and if you want use that pipe in specific module, you need to import pipe module in that module only.
  • Valen
    Valen about 4 years
    "90% of angular (material) problems are solved by importing the correct module"
  • Ray Andison
    Ray Andison almost 4 years
    90% of angular problems are caused by poor documentation
  • Guillaume
    Guillaume over 3 years
    Please, do Not ask me how long it took me to find out…
  • H3AR7B3A7
    H3AR7B3A7 almost 3 years
    It is advised to no longer user the 'providers: [ ] ' array for things like services and pipes when it is not needed. A custom pipe should just be imported and declared.