Make sure you are not facing a "cross module" problem
If the component which is using the pipe, doesn't belong to the module which has declared the pipe component "globally" then the pipe is not found and you get this error message.
In my case I've declared the pipe in a separate module and imported this pipe module in any other module having components using the pipe.
I have declared a that the component in which you are using the pipe is
the Pipe Module
import { NgModule } from '@angular/core';
import { myDateFormat } from '../directives/myDateFormat';
@NgModule({
imports: [],
declarations: [myDateFormat],
exports: [myDateFormat],
})
export class PipeModule {
static forRoot() {
return {
ngModule: PipeModule,
providers: [],
};
}
}
Usage in another module (e.g. app.module)
// Import APPLICATION MODULES
...
import { PipeModule } from './tools/PipeModule';
@NgModule({
imports: [
...
, PipeModule.forRoot()
....
],
You need to include your pipe in module declaration:
declarations: [ UsersPipe ],
providers: [UsersPipe]
For Ionic you can face multiple issues as @Karl mentioned. The solution which works flawlessly for ionic lazy loaded pages is:
// pipes.ts content (it can have multiple pipes inside, just remember to
use @Pipe function before each class)
import { PipeTransform, Pipe } from "@angular/core";
@Pipe({ name: "toArray" })
export class toArrayPipe implements PipeTransform {
transform(value, args: string[]): any {
if (!value) return value;
let keys = [];
for (let key in value) {
keys.push({ key: key, value: value[key] });
}
return keys;
}
}
// pipes.module.ts content
import { NgModule } from "@angular/core";
import { IonicModule } from "ionic-angular";
import { toArrayPipe } from "./pipes";
@NgModule({
declarations: [toArrayPipe],
imports: [IonicModule],
exports: [toArrayPipe]
})
export class PipesModule {}
Include PipesModule into app.module and @NgModule imports section
import { PipesModule } from "../pipes/pipes.module";
@NgModule({
imports: [
PipesModule
]
});
Include PipesModule in each of your .module.ts where you want to use custom pipes. Don't forget to add it into imports section. // Example. file: pages/my-custom-page/my-custom-page.module.ts
import { PipesModule } from "../../pipes/pipes.module";
@NgModule({
imports: [
PipesModule
]
})
Thats it. Now you can use your custom pipe in your template. Ex.
<div *ngFor="let prop of myObject | toArray">{{ prop.key }}</div>
I found the "cross module" answer above very helpful to my situation, but would want to expand on that, as there is another wrinkle to consider. If you have a submodule, it also can't see the pipes in the parent module in my testing. For that reason also, you may need to put pipes into there own separate module.
Here's a summary of the steps I took to address pipes not being visible in the submodule:
Another footnote to the above "cross module" answer: when I created the PipeModule I removed the forRoot static method and imported PipeModule without that in my shared module. My basic understanding is that forRoot is useful for scenarios like singletons, which don't apply to filters necessarily.
Suggesting an alternative answer here:
Making a separate module for the Pipe is not required, but is definitely an alternative. Check the official docs footnote: https://angular.io/guide/pipes#custom-pipes
You use your custom pipe the same way you use built-in pipes.
You must include your pipe in the declarations array of the AppModule . If you choose to inject your pipe into a class, you must provide it in the providers array of your NgModule.
All you have to do is add your pipe to the declarations array, and the providers array in the module
where you want to use the Pipe.
declarations: [
...
CustomPipe,
...
],
providers: [
...
CustomPipe,
...
]
Custom Pipes: When a custom pipe is created, It must be registered in Module and Component that is being used.
export class SummaryPipe implements PipeTransform{
//Implementing transform
transform(value: string, limit?: number): any {
if (!value) {
return null;
}
else {
let actualLimit=limit>0?limit:50
return value.substr(0,actualLimit)+'...'
}
}
}
Add Pipe Decorator
@Pipe({
name:'summary'
})
and refer
import { SummaryPipe } from '../summary.pipe';` //**In Component and Module**
<div>
**{{text | summary}}** //Name should same as it is mentioned in the decorator.
</div>
//summary is the name declared in Pipe decorator
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With