Pipa '' tidak bisa ditemukan pipa custom angular2


105

Sepertinya saya tidak bisa memperbaiki kesalahan ini. Saya memiliki bilah pencarian dan ngFor. Saya mencoba memfilter array menggunakan pipa khusus seperti ini:

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);
  }
}

Pemakaian:

<input [(ngModel)]="searchTerm" type="text" placeholder="Search users">

<div *ngFor="let user of (users | usersPipe:searchTerm)">
...
</div>

Kesalahan:

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)">

Versi sudut:

"@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"

1
Apakah Anda memasukkannya ke dalam Komponen Pipa?
Harry Ninh

Saya baru menyadari itulah alasannya. Kenapa contoh sudut untuk pipa khusus tidak pernah melakukan ini: angular.io/resources/live-examples/pipes/ts/plnkr.html
Sumama Waheed

Mereka mendefinisikannya sebagai pipa global. Anda dapat melakukan hal yang sama pada pipa kustom Anda jika Anda menggunakannya di banyak tempat dan tidak ingin menentukan di setiap anotasi.
Harry Ninh

@SumamaWaheed Saya cukup yakin bahwa itu ada di beberapa titik di dokumen, tetapi Anda benar dokumen sekarang tidak menyebutkan / menampilkannya.
Michelangelo

Jawaban:


144

Pastikan Anda tidak menghadapi masalah "modul silang"

Jika komponen yang menggunakan pipa, bukan milik modul yang telah mendeklarasikan komponen pipa "secara global" maka pipa tidak ditemukan dan Anda mendapatkan pesan kesalahan ini.

Dalam kasus saya, saya telah mendeklarasikan pipa dalam modul terpisah dan mengimpor modul pipa ini ke modul lain yang memiliki komponen menggunakan pipa.

Saya telah menyatakan bahwa komponen yang Anda gunakan adalah pipa

Modul Pipa

 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: [],
      };
   }
 } 

Penggunaan di modul lain (mis. App.module)

  // Import APPLICATION MODULES
  ...
  import { PipeModule }    from './tools/PipeModule';

  @NgModule({
     imports: [
    ...
    , PipeModule.forRoot()
    ....
  ],

6
Solusi ini adalah satu-satunya yang berhasil untuk saya. Ternyata pipa harus memiliki modul
AJ Zane

Saya juga menemukan ini untuk sebagian menyelesaikan kesalahan pipa saya tidak ditemukan di Ng 2.8. * Selain itu, saya memiliki "peringatan" skrip yang hanya terkait dengan konvensi penamaan yang digunakan, yang setelah menyelesaikannya, berkontribusi pada pipa kustom ini yang tembus dengan benar dan akhirnya ditemukan di dalam template.
CNSKnight

Ini benar-benar satu-satunya solusi yang berhasil untuk saya! Saya mencoba semua modul bersama, tetapi solusi ini bekerja seperti pesona. Terima kasih @Karl!
lulu88

bagaimana kami mengujinya dalam pengujian komponen kami,
apoorva

2
Terima kasih! Masalah saya adalah saya melewatkan "ekspor: [myPipe]" berpikir bahwa ekspor hanya untuk modul!
Rafique Mohammed

55

Anda perlu menyertakan pipa Anda dalam deklarasi modul:

declarations: [ UsersPipe ],
providers: [UsersPipe]

5
Sekadar catatan, awalnya saya hanya mencantumkan pipa di provider. Ini perlu disertakan dalam deklarasi dan penyedia di file modul.
Greg A

Saya berjuang sampai saya mengikuti saran Anda. saya menyia-nyiakan sekitar 4 jam untuk hanya mengetahuinya. Terima kasih atas sarannya.
pengguna1501382

5
Mengapa ini tidak didokumentasikan? Dokumentasi menyatakan You must include your pipe in the declarations array of the AppModule.: angular.io/guide/pipes . Bagaimanapun, jawaban Anda juga memperbaiki masalah saya.
Martijn

Terima kasih, Yuvals. Saya menambahkan detail: deklarasi modul di mana Anda membutuhkan pipa.
Vinicios Torres

5
Jangan lupa juga untuk menyertakan exports: [UsersPipe]jika modul tersebut akan diimpor oleh modul lain.
Prekastik

18

Untuk Ionic, Anda dapat menghadapi banyak masalah seperti yang disebutkan @Karl. Solusi yang bekerja dengan sempurna untuk halaman ionik yang lambat dimuat adalah:

  1. Buat direktori pipa dengan file berikut: pipa.ts dan pipa.module.ts

// pipe.ts content (bisa memiliki banyak pipa di dalamnya, ingat saja

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;
  }
}

// konten pipa.module.ts

import { NgModule } from "@angular/core";
import { IonicModule } from "ionic-angular";
import { toArrayPipe } from "./pipes";

@NgModule({
  declarations: [toArrayPipe],
  imports: [IonicModule],
  exports: [toArrayPipe]
})
export class PipesModule {}
  1. Sertakan PipesModule ke bagian impor app.module dan @NgModule

    import { PipesModule } from "../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] });

  2. Sertakan PipesModule di setiap .module.ts tempat Anda ingin menggunakan pipa kustom. Jangan lupa untuk menambahkannya ke bagian impor. // Contoh. file: pages / my-custom-page / my-custom-page.module.ts

    import { PipesModule } from "../../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] })

  3. Itu dia. Sekarang Anda dapat menggunakan pipa kustom Anda di template Anda. Ex.

<div *ngFor="let prop of myObject | toArray">{{ prop.key }}</div>


Ini adalah penyelamat ionik, terima kasih. Karena "pipa penghasil ionik ...." tidak menghasilkan semua langkah yang diperlukan, seperti membuat pipa.module.ts. Pendekatan Anda bekerja dengan sempurna. Perhatikan, untuk ionic v4, beberapa perubahan kecil diperlukan pada jalur impor.
royappa

1
Saya menemukan bahwa Anda tidak memerlukan impor di app.module.ts, sehingga langkah itu dapat dihilangkan. Itu pasti karena "modul bersama" tetap diimpor ke modul lain jika diperlukan. Alangkah baiknya jika impor app.module berfungsi secara global, tetapi saya mencoba dan ternyata tidak.
royappa

Saya masih menghadapi ini: CONSOLE ERROR file: node_modules/@angular/core/fesm5/core.js: 4002: 0 ERROR Error: Uncaught (in promise): NullInjectorError: StaticInjectorError (AppModule) [ToHtmlPipe -> DomSanitizer]: StaticInjectorEr (Platform: core) [ToHtmlPipe -> DomSanitizer]: NullInjectorError: Tidak ada penyedia untuk DomSanitizer!
mircobabini

12

Saya menemukan jawaban "modul silang" di atas sangat membantu situasi saya, tetapi saya ingin memperluasnya, karena ada masalah lain yang perlu dipertimbangkan. Jika Anda memiliki submodul, ia juga tidak dapat melihat pipa di modul induk dalam pengujian saya. Untuk alasan itu juga, Anda mungkin perlu memasang pipa ke modul terpisah di sana.

Berikut ringkasan langkah-langkah yang saya lakukan untuk mengatasi pipa yang tidak terlihat di submodule:

  1. Keluarkan pipa dari (induk) SharedModule dan masukkan ke PipeModule
  2. Di SharedModule, impor PipeModule dan ekspor (untuk bagian lain dari aplikasi yang bergantung pada SharedModule untuk secara otomatis mendapatkan akses ke PipeModule)
  3. Untuk Sub-SharedModule, impor PipeModule, sehingga dapat memperoleh akses ke PipeModule, tanpa harus mengimpor ulang SharedModule yang akan membuat masalah dependensi melingkar, di antara masalah lainnya.

Catatan kaki lain untuk jawaban "modul silang" di atas: ketika saya membuat PipeModule saya menghapus metode statis forRoot dan mengimpor PipeModule tanpa itu di modul bersama saya. Pemahaman dasar saya adalah bahwa forRoot berguna untuk skenario seperti lajang, yang tidak berlaku untuk filter.


1
Terima kasih telah menambahkan ini. Ini hanya bekerja untuk saya setelah ditambahkan ke Sub-SharedModule
jmcgrath207

Ya sama di sini, bagian yang saya lewatkan adalah mengimpor PipesModule ke Sub-SharedModule.
tenderloin

1

Menyarankan jawaban alternatif di sini:

Membuat modul terpisah untuk Pipa tidak diperlukan , tetapi jelas merupakan alternatif. Periksa catatan kaki dokumen resmi: https://angular.io/guide/pipes#custom-pipes

Anda menggunakan pipa khusus Anda dengan cara yang sama seperti Anda menggunakan pipa bawaan.
Anda harus memasukkan pipa Anda ke dalam array deklarasi AppModule. Jika Anda memilih untuk menyuntikkan pipa Anda ke dalam kelas, Anda harus menyediakannya dalam larik penyedia NgModule Anda.

Yang harus Anda lakukan adalah menambahkan pipa Anda ke array deklarasi , dan array provider di moduletempat Anda ingin menggunakan Pipe.

declarations: [
...
CustomPipe,
...
],
providers: [
...
CustomPipe,
...
]

Tetapi satu pipa tidak dapat menjadi bagian dari 2 modul .... Pendekatan di atas membuatnya lebih mudah didekati dalam modul yang berbeda.
Himanshu Bansal

0

Catatan : Hanya jika Anda tidak menggunakan modul sudut

Untuk beberapa alasan ini tidak ada di dokumen tetapi saya harus mengimpor pipa kustom di komponen

import {UsersPipe} from './users-filter.pipe'

@Component({
    ...
    pipes:      [UsersPipe]
})

1
Di Plunker yang Anda posting di atas, pipa diimpor dalam modul aplikasi (persis seperti yang Anda lakukan dengan komponen itu sendiri) yang membuat pipa tersedia untuk semua komponen dalam modul itu.
ABabin

Oh ok saya sebenarnya melihat komponen yang sebenarnya menggunakan pipa custom. Saya tidak tahu itu bisa diimpor secara global dalam modul aplikasi. Terima kasih
Sumama Waheed

users-filter.pipe? mengapa .pipe?
Nather Webber

1
Itu hanya konvensi penamaan, file bernama users-filter.pipe.ts
Sumama Waheed

2
@SachinThampan bisa jadi karena saat itu angular di rc5 saya rasa..sudah berubah sejak itu khususnya dengan NgModule. Silakan lihat dokumen untuk NgModule
Sumama Waheed

-1
import { Component, Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'timePipe'
})
export class TimeValuePipe implements PipeTransform {

  transform(value: any, args?: any): any {
   var hoursMinutes = value.split(/[.:]/);
  var hours = parseInt(hoursMinutes[0], 10);
  var minutes = hoursMinutes[1] ? parseInt(hoursMinutes[1], 10) : 0;
  console.log('hours ', hours);
  console.log('minutes ', minutes/60);
  return (hours + minutes / 60).toFixed(2);
  }
}
@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  name = 'Angular';
  order = [
    {
      "order_status": "Still at Shop",
      "order_id": "0:02"
    },
    {
      "order_status": "On the way",
      "order_id": "02:29"
    },
    {
      "order_status": "Delivered",
      "order_id": "16:14"
    },
     {
      "order_status": "Delivered",
      "order_id": "07:30"
    }
  ]
}

Invoke this module in App.Module.ts file.

-2

Saya telah membuat modul untuk pipa di direktori yang sama di mana pipa saya berada

import { NgModule } from '@angular/core';
///import pipe...
import { Base64ToImage, TruncateString} from './'  

   @NgModule({
        imports: [],
        declarations: [Base64ToImage, TruncateString],
        exports: [Base64ToImage, TruncateString]
    })

    export class SharedPipeModule { }   

Sekarang impor modul itu di app.module:

import {SharedPipeModule} from './pipe/shared.pipe.module'
 @NgModule({
     imports: [
    ...
    , PipeModule.forRoot()
    ....
  ],

Sekarang dapat digunakan dengan mengimpor yang sama di modul bersarang

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.