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"
Sumama Waheed
sumber
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()
    ....
  ],
Karl
sumber
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]
Yuvals
sumber
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>

Timothy
sumber
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.

sarora
sumber
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,
...
]
ykadaru
sumber
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]
})
Sumama Waheed
sumber
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.
Chowdeswara Rao
sumber
-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

Amit Saini
sumber