Nie mogę naprawić tego błędu. Mam pasek wyszukiwania i plik ngFor. Próbuję przefiltrować tablicę za pomocą niestandardowego potoku, takiego jak ten:
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);
}
}
Stosowanie:
<input [(ngModel)]="searchTerm" type="text" placeholder="Search users">
<div *ngFor="let user of (users | usersPipe:searchTerm)">
...
</div>
Błąd:
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)">
Wersje kątowe:
"@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
źródło
źródło
Odpowiedzi:
Upewnij się, że nie masz problemu z „modułami krzyżowymi”
Jeśli komponent używający potoku nie należy do modułu, który zadeklarował komponent potoku „globalnie”, potok nie zostanie znaleziony i pojawi się ten komunikat o błędzie.
W moim przypadku zadeklarowałem rurę w oddzielnym module i zaimportowałem ten moduł rurowy do dowolnego innego modułu zawierającego komponenty wykorzystujące rurę.
Zadeklarowałem, że komponent, w którym używasz rury, jest
moduł rurowy
Wykorzystanie w innym module (np. App.module)
źródło
Musisz dołączyć potok do deklaracji modułu:
źródło
You must include your pipe in the declarations array of the AppModule.
: angular.io/guide/pipes . W każdym razie twoja odpowiedź również rozwiązuje mój problem.exports: [UsersPipe]
czy moduł ma być importowany przez inne moduły.W przypadku Ionic możesz napotkać wiele problemów, o których wspomniał @Karl. Rozwiązaniem, które działa bezbłędnie w przypadku jonowych, leniwych ładowanych stron, jest:
// pipe.ts content (może zawierać wiele potoków w środku, pamiętaj tylko o tym
// pipe.module.ts content
Dołącz PipesModule do sekcji importu app.module i @NgModule
import { PipesModule } from "../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] });
Dołącz PipesModule do każdego pliku .module.ts, w którym chcesz używać niestandardowych potoków. Nie zapomnij dodać go do sekcji importu. // Przykład. file: pages / my-custom-page / my-custom-page.module.ts
import { PipesModule } from "../../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] })
Otóż to. Teraz możesz użyć niestandardowej rury w swoim szablonie. Dawny.
<div *ngFor="let prop of myObject | toArray">{{ prop.key }}</div>
źródło
Uważam, że powyższa odpowiedź „modułu krzyżowego” jest bardzo pomocna w mojej sytuacji, ale chciałbym ją rozwinąć, ponieważ jest jeszcze jedna kwestia do rozważenia. Jeśli masz moduł podrzędny, nie widzi on również rur w module nadrzędnym podczas moich testów. Z tego też powodu może być konieczne umieszczenie rur w tym oddzielnym module.
Oto podsumowanie kroków, które podjąłem, aby rozwiązać problem niewidocznych potoków w module podrzędnym:
Kolejny przypis do powyższej odpowiedzi „cross module”: kiedy tworzyłem PipeModule, usunąłem statyczną metodę forRoot i zaimportowałem PipeModule bez tego w moim współdzielonym module. Moje podstawowe rozumienie jest takie, że forRoot jest przydatny w scenariuszach takich jak singletony, które niekoniecznie mają zastosowanie do filtrów.
źródło
Sugerowanie alternatywnej odpowiedzi tutaj:
Wykonanie oddzielnego modułu dla Pipe nie jest wymagane , ale jest zdecydowanie alternatywą. Sprawdź oficjalny przypis do dokumentów: https://angular.io/guide/pipes#custom-pipes
Wszystko, co musisz zrobić, to dodać potok do tablicy deklaracji , a tablicę dostawców w miejscu, w
module
którym chcesz użyć potoku .źródło
Uwaga: tylko jeśli nie używasz modułów kątowych
Z jakiegoś powodu nie ma tego w dokumentacji, ale musiałem zaimportować niestandardową rurę w komponencie
źródło
źródło
Utworzyłem moduł dla rur w tym samym katalogu, w którym znajdują się moje potoki
Teraz zaimportuj ten moduł do app.module:
Teraz można go użyć, importując to samo w zagnieżdżonym module
źródło