Angular2: Benutzerdefiniertes Rohr konnte nicht gefunden werden

79

Das eingebaute Rohr ist Arbeit, aber alle benutzerdefinierten Rohre, die ich verwenden möchte, sind der gleiche Fehler:

Die Pipe 'actStatusPipe' wurde nicht gefunden

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

Ich habe zwei Möglichkeiten ausprobiert, deklariere es in den Erklärungen von app.module:

app.module.ts:

import {ActStatusPipe} from '../pipe/actPipe'

@NgModule({
    declarations: [
        AppComponent,
        HomePage,
        ActivitiesList,
        ActStatusPipe
    ],
    ...
})

Oder verwenden Sie ein anderes Modul, um alle meine Pipes zu deklarieren und zu exportieren: // pipe

import {ActStatusPipe} from "./actPipe"

@NgModule({
    declarations:[ActStatusPipe],
    imports:[CommonModule],
    exports:[ActStatusPipe]
})

export class MainPipe{}

und importiere es in app.module.

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

Aber keiner von ihnen funktioniert in meiner App.

Hier ist mein Code der 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
        }
    }
}

Ich denke, es ist fast das gleiche mit dem Dokument (in der Tat habe ich gerade aus dem Dokument kopiert und eine kleine Änderung vorgenommen)

Und die Version von Angular2 ist 2.1.

Viele Lösungen, die in stackOverflow und google gesucht werden können, werden in meiner App ausprobiert, funktionieren jedoch nicht.

Das hat mich sehr verwirrt, danke für deine Antwort!

rui
quelle
Könnten Sie es auf dem Plunker reproduzieren?
Yurzui
viel Verwirrung in Ihrem Code auch. Versuchen Sie zunächst, dies zu vereinfachen, erstellen Sie eine benutzerdefinierte Pipe und fügen Sie Deklarationen hinzu: [AppComponent, CapitalizePipe] -Array von NgModule (). als lassen Sie mich wissen, dass es funktioniert?
Vinay Pandya
@ yurzui Ich würde versuchen, nach der Arbeit
Rui
@ VinayPandya die Fehlermeldung ist unten: Template Parse Fehler: Die Pipe 'actStatusPipe' konnte nicht gefunden werden
rui
Ich habe gerade Ihre Pfeife kopiert und es funktioniert für mich
Vinay Pandya

Antworten:

95

siehe, das funktioniert bei mir.

ActStatus.pipe.ts Zuerst ist dies meine 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 im Rohrmodul muss ich meine Rohrleitung (en) deklarieren und exportieren.

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 Benutzer dieses Pipe-Moduls in einem beliebigen Modul.

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

Sie können Pipe direkt in diesem Modul verwenden. Wenn Sie jedoch das Gefühl haben, dass Ihre Pfeife in mehr als einer Komponente verwendet wird, empfehle ich Ihnen, meinem Ansatz zu folgen.

  1. Rohr erstellen.
  2. Erstellen Sie ein separates Modul und deklarieren und exportieren Sie eine oder mehrere Pipe.
  3. Benutzer dieses Rohrmodul.

Die Verwendung von Rohren hängt vollständig von der Komplexität und den Anforderungen Ihres Projekts ab. Möglicherweise haben Sie nur eine Pipe, die im gesamten Projekt nur einmal verwendet wurde. In diesem Fall können Sie es direkt verwenden, ohne ein Pipe / s-Modul zu erstellen (Modulansatz).

Vinay Pandya
quelle
16
Schließlich finde ich heraus, dass es daran liegt, dass ich die Pipe im Root-Modul importiere und sie in einem Komponentenimport durch ein anderes Modul verwende. Ich denke nur, dass es vorher global funktioniert und der Fehler durch meine Pipe verursacht wird. Ihre Antwort inspiriert mich, dies herauszufinden, danke für Ihre Hilfe!
Rui
@rui Ihr Kommentar rettete meinen Tag .. Ich hatte auch das gleiche Problem .. hahaha
Shashank Gaurav
@rui wie oben, Ihr Kommentar hat mich gerettet
GBarroso
3
@Rui, kannst du klarer sagen, wie du das gelöst hast?
Rhyous
1
Das Hinzufügen einer Pipe zu einem eigenen Modul ist nicht erforderlich - es ist nur eine Alternative. In den offiziellen Dokumenten ( angle.io/guide/pipes#custom-pipes ) heißt es, dass Rohre deklariert und bereitgestellt werden müssen , damit sie injizierbar sind .
Ykadaru
21

Das hat bei mir nicht funktioniert. (Ich bin mit Angular 2.1.2). Ich musste MainPipeModule NICHT in app.module.ts importieren und es stattdessen in das Modul importieren, in das auch die Komponente importiert wird, die die Pipe verwendet.

Wenn Ihre Komponente in einem anderen Modul deklariert und importiert wird, müssen Sie Ihr PipeModule auch in dieses Modul aufnehmen.

Ramon Gonzalez
quelle
4
Was? Das macht keinen Sinn. Es gibt keinen globalen Import für so etwas?
Phil
aber was ist, wenn Sie es in 2 Module importieren müssen? Ich finde, das funktioniert nicht. Ich bekomme einen Konsolenfehler, der besagt, dass ich es in einem höheren Modul anstelle von 2 Modulen verwenden soll, aber dann macht das App-Modul nicht den Trick
SeanMC
Ja, so funktioniert Angular. Wenn Sie dieses Pipe-Modul in Ihrer Angular-App verwenden möchten, können Sie es in app.module.ts importieren. Wenn Sie dieses Pipe in einem bestimmten Modul verwenden möchten, müssen Sie das Pipe-Modul in dieses Modul importieren nur.
Vinay Pandya
4
import {CommonModule} from "@angular/common";

Das Hinzufügen dieser Anweisung zum Pipe-Modul hat mein Problem gelöst.

Anitta Paul
quelle
1
"90% der Winkel- (Material-) Probleme werden durch den Import des richtigen Moduls gelöst"
Valen
2
90% der Winkelprobleme werden durch schlechte Dokumentation verursacht
Ray Andison
3

Ich habe kein Problem mit der akzeptierten Antwort, da sie mir sicherlich geholfen hat. Nach der Implementierung habe ich jedoch immer noch den gleichen Fehler erhalten.

Es stellte sich heraus, dass ich die Pipes auch in meiner Komponente falsch aufgerufen habe:

Meine custom-pipe.ts-Datei:

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

So weit, so gut, aber in meiner Datei component.html habe ich die Pipes wie folgt aufgerufen:

{{ myData | doSomethingPipe }}

Dies löst erneut den Fehler aus, dass die Pipe nicht gefunden wurde. Dies liegt daran, dass Angular die Rohre unter dem im Rohrdekorator definierten Namen nachschlägt. In meinem Beispiel sollte die Pipe stattdessen so heißen:

{{ myData | doSomething }}

Dummer Fehler, aber es hat mich ziemlich viel Zeit gekostet. Hoffe das hilft!

Leonardum
quelle
2

Eine wirklich dumme Antwort (ich werde mich gleich abstimmen), aber das hat bei mir funktioniert:

Wenn Sie nach dem Hinzufügen Ihrer Pipe immer noch Fehler erhalten und Ihre Angular-Site mit " ng serve" ausführen , stoppen Sie sie ... und starten Sie sie erneut.

Für mich hat keiner der anderen Vorschläge funktioniert, aber ng servees hat gereicht , einfach anzuhalten und dann " " neu zu starten , um den Fehler zu beheben.

Seltsam.

Mike Gledhill
quelle
Das hat bei mir total
geklappt
0

Wenn Sie Ihre Pipe in einem anderen Modul deklarieren, stellen Sie sicher, dass Sie sie dem Modul "Deklarationen und Exporte" des Moduls hinzufügen, und importieren Sie das Modul in das Modul, das diese Pipe verwendet.

Ross
quelle
0

Stellen Sie sicher, dass Sie, wenn die Deklarationen für die Pipe in einem Modul ausgeführt werden, während Sie die Pipe in einem anderen Modul verwenden, korrekte Importe / Deklarationen im aktuellen Modul bereitstellen, unter dem sich die Klasse befindet, in der Sie die Pipe verwenden. In meinem Fall war das der Grund für den Pipe Miss

Ilya Yevlampiev
quelle
0

Ich bin auf ein ähnliches Problem gestoßen, aber das Einfügen in das Modul meiner Seite hat nicht funktioniert.

Ich hatte eine Komponente erstellt, die ein Rohr benötigte. Diese Komponente wurde deklariert und in eine ComponentsModule-Datei exportiert, die alle benutzerdefinierten Komponenten der App enthält.

Ich musste mein PipesModule als Import in mein ComponentsModule einfügen, damit diese Komponenten diese Pipes verwenden konnten und nicht im Modul der Seite, das diese Komponente verwendet.

Credits : Linkbeschreibung hier eingeben Antwort von: tumain

SagitSri
quelle