Parece que no puedo corregir este error. Tengo una barra de búsqueda y un ngFor. Estoy tratando de filtrar la matriz usando una tubería personalizada como esta:
import { Pipe, PipeTransform } from '@angular/core';
import { User } from '../user/user';
@Pipe({
name: 'usersPipe',
pure: false
})
export class UsersPipe implements PipeTransform {
transform(users: User [], searchTerm: string) {
return users.filter(user => user.name.indexOf(searchTerm) !== -1);
}
}
Uso:
<input [(ngModel)]="searchTerm" type="text" placeholder="Search users">
<div *ngFor="let user of (users | usersPipe:searchTerm)">
...
</div>
Error:
zone.js:478 Unhandled Promise rejection: Template parse errors:
The pipe 'usersPipe' could not be found ("
<div class="row">
<div
[ERROR ->]*ngFor="let user of (user | usersPipe:searchTerm)">
Versiones angulares:
"@angular/common": "2.0.0-rc.5",
"@angular/compiler": "2.0.0-rc.5",
"@angular/core": "2.0.0-rc.5",
"@angular/platform-browser": "2.0.0-rc.5",
"@angular/platform-browser-dynamic": "2.0.0-rc.5",
"@angular/router": "3.0.0-rc.1",
"@angular/forms": "0.3.0",
"@angular/http": "2.0.0-rc.5",
"es6-shim": "^0.35.0",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"systemjs": "0.19.26",
"bootstrap": "^3.3.6",
"zone.js": "^0.6.12"
angular
angular2-forms
angular2-pipe
Sumama Waheed
fuente
fuente
Respuestas:
Asegúrese de no enfrentarse a un problema de "módulo cruzado"
Si el componente que está usando la tubería no pertenece al módulo que ha declarado el componente de tubería "globalmente", entonces la tubería no se encuentra y aparece este mensaje de error.
En mi caso, he declarado la tubería en un módulo separado e importé este módulo de tubería en cualquier otro módulo que tenga componentes que usen la tubería.
He declarado que el componente en el que está utilizando la tubería es
el módulo de tubería
Uso en otro módulo (por ejemplo, módulo de aplicación)
fuente
Debe incluir su tubería en la declaración del módulo:
fuente
You must include your pipe in the declarations array of the AppModule.
: angular.io/guide/pipes . De todos modos, tu respuesta también soluciona mi problema.exports: [UsersPipe]
si el módulo será importado por otros módulos.Para Ionic, puede enfrentar múltiples problemas como mencionó @Karl. La solución que funciona perfectamente para páginas cargadas diferidas iónicas es:
// pipe.ts contenido (puede tener múltiples tuberías en su interior, solo recuerde
// contenido de las tuberías.module.ts
Incluya PipesModule en app.module y en la sección de importaciones de @NgModule
import { PipesModule } from "../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] });
Incluya PipesModule en cada uno de sus .module.ts donde desee utilizar tuberías personalizadas. No olvide agregarlo a la sección de importaciones. // Ejemplo. archivo: pages / my-custom-page / my-custom-page.module.ts
import { PipesModule } from "../../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] })
Eso es. Ahora puede usar su tubería personalizada en su plantilla. Ex.
<div *ngFor="let prop of myObject | toArray">{{ prop.key }}</div>
fuente
Encontré la respuesta del "módulo cruzado" anterior muy útil para mi situación, pero me gustaría ampliar eso, ya que hay otra arruga a considerar. Si tiene un submódulo, tampoco puede ver las tuberías en el módulo principal en mis pruebas. También por esa razón, es posible que deba colocar tuberías en su propio módulo separado.
Aquí hay un resumen de los pasos que tomé para abordar las tuberías que no están visibles en el submódulo:
Otra nota al pie de la respuesta de "módulo cruzado" anterior: cuando creé el PipeModule, eliminé el método estático forRoot e importé PipeModule sin eso en mi módulo compartido. Mi conocimiento básico es que forRoot es útil para escenarios como singletons, que no se aplican necesariamente a los filtros.
fuente
Sugerir una respuesta alternativa aquí:
No se requiere hacer un módulo separado para la tubería , pero definitivamente es una alternativa. Consulte la nota al pie de la documentación oficial: https://angular.io/guide/pipes#custom-pipes
Todo lo que tiene que hacer es agregar su tubería a la matriz de declaraciones y la matriz de proveedores en el lugar
module
donde desea usar la tubería.fuente
Nota: solo si no está utilizando módulos angulares
Por alguna razón, esto no está en los documentos, pero tuve que importar la tubería personalizada en el componente
fuente
fuente
He creado un módulo para tuberías en el mismo directorio donde están presentes mis tuberías
Ahora importe ese módulo en app.module:
Ahora se puede usar importando el mismo en el módulo anidado
fuente