파이프 ''을 (를) 찾을 수 없습니다. angular2 사용자 지정 파이프


105

이 오류를 수정할 수없는 것 같습니다. 검색 창과 ngFor가 있습니다. 다음과 같은 사용자 지정 파이프를 사용하여 배열을 필터링하려고합니다.

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

용법:

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

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

오류:

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

각도 버전 :

"@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
컴포넌트의 파이프에 포함 시켰습니까?
Harry Ninh

그게 이유라는 걸 깨달았습니다. 어떻게 사용자 정의 파이프의 각도 예를 올 결코이하지 않는다 : angular.io/resources/live-examples/pipes/ts/plnkr.html
Sumama 와히드

그들은 그것을 글로벌 파이프로 정의했습니다. 여러 곳에서 사용하고 모든 단일 주석에서 정의하고 싶지 않은 경우 사용자 지정 파이프에 동일한 작업을 수행 할 수 있습니다.
Harry Ninh

@SumamaWaheed 나는 그것이 문서의 어느 시점에서 거기에 있었다고 확신하지만, 당신은 이제 문서가 정확합니다.
Michelangelo

답변:


144

"교차 모듈"문제 가 없는지 확인하십시오.

파이프를 사용하는 구성 요소가 "전역 적으로"파이프 구성 요소를 선언 한 모듈에 속하지 않으면 파이프를 찾을 수 없으며이 오류 메시지가 표시됩니다.

제 경우에는 별도의 모듈에서 파이프를 선언하고 파이프를 사용하는 구성 요소가있는 다른 모듈에서이 파이프 모듈을 가져 왔습니다.

파이프를 사용하는 구성 요소가

파이프 모듈

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

다른 모듈에서의 사용 (예 : app.module)

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

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

6
이 솔루션은 나를 위해 일한 유일한 솔루션이었습니다. 파이프 판명는 모듈이 필요합니다
AJ 젠

나 역시 Ng 2.8에서 파이프를 찾을 수 없음 오류를 부분적으로 해결하기 위해 이것을 발견했습니다. 템플릿에서.
CNSKnight

이것은 진정으로 나를 위해 일한 유일한 솔루션입니다! 나는 전체 공유 모듈을 시도했지만이 솔루션은 매력적으로 작동했습니다. @Karl 감사합니다!
lulu88

컴포넌트 테스트에서 이것을 어떻게 테스트합니까?
apoorva

2
감사! 내 문제는 "exports : [myPipe]"를 놓쳤습니다. 내보내기는 모듈 전용이라고 생각했습니다!
Rafique 모하메드

55

모듈 선언에 파이프를 포함해야합니다.

declarations: [ UsersPipe ],
providers: [UsersPipe]

5
참고로, 원래 공급자에 파이프를 포함 시켰습니다. 이는 모듈 파일의 선언과 공급자 모두에 포함되어야합니다.
그렉

나는 당신의 제안을 따를 때까지 고군분투했습니다. 나는 그것을 알아 내기 위해 약 4 시간을 낭비했습니다. 제안 해 주셔서 감사합니다.
user1501382

5
문서화되지 않은 이유는 무엇입니까? 문서 상태 You must include your pipe in the declarations array of the AppModule.: angular.io/guide/pipes . 어쨌든 귀하의 답변은 내 문제도 해결합니다.
Martijn

고마워, Yuvals. 세부 사항을 추가합니다 : 파이프가 필요한 곳에 모듈 선언.
Vinicios 토레스

5
exports: [UsersPipe]다른 모듈에서 모듈을 가져올 것인지 도 포함 하는 것을 잊지 마십시오 .
Precastic

18

Ionic의 경우 @Karl이 언급했듯이 여러 문제에 직면 할 수 있습니다. 이온 지연로드 페이지에 대해 완벽하게 작동하는 솔루션은 다음과 같습니다.

  1. pipes.tspipes.module.ts 파일로 파이프 디렉토리를 작성하십시오.

// pipes.ts 콘텐츠 (내부에 여러 개의 파이프가있을 수 있습니다.

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

// pipes.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. App.module 및 @NgModule 가져 오기 섹션에 PipesModule 포함

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

  2. 사용자 지정 파이프를 사용하려는 각 .module.ts에 PipesModule을 포함합니다. 가져 오기 섹션에 추가하는 것을 잊지 마십시오. // 예. 파일 : pages / my-custom-page / my-custom-page.module.ts

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

  3. 그게 다야. 이제 템플릿에서 사용자 지정 파이프를 사용할 수 있습니다. 전의.

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


이것은 이온의 생명의 은인이었습니다. 감사합니다. "ionic generate pipe ...."는 pipes.module.ts 생성과 같이 필요한 모든 단계를 생성하지 않기 때문입니다. 귀하의 접근 방식은 완벽하게 작동했습니다. ionic v4의 경우 가져 오기 경로에 약간의 변경이 필요합니다.
royappa

1
app.module.ts에서 가져 오기가 필요하지 않으므로 해당 단계를 생략 할 수 있습니다. 어쨌든 "공유 모듈"이 필요한 곳에서 서로 다른 모듈로 가져 오기 때문이어야합니다. app.module 가져 오기가 전 세계적으로 작동하면 좋을 것 같지만 시도했지만 그렇지 않았습니다.
royappa

나는 여전히 이것을 직면하고있다 : CONSOLE ERROR file : node_modules/@angular/core/fesm5/core.js : 4002 : 0 ERROR Error : Uncaught (in promise) : NullInjectorError : StaticInjectorError (AppModule) [ToHtmlPipe-> DomSanitizer] : StaticInjectorError (플랫폼 : core) [ToHtmlPipe-> DomSanitizer] : NullInjectorError : DomSanitizer에 대한 공급자가 없습니다!
mircobabini

12

위의 "교차 모듈"답변이 내 상황에 매우 유용하다는 것을 알았지 만 고려해야 할 또 다른 주름이 있으므로 확장하고 싶습니다. 하위 모듈이있는 경우 내 테스트에서 상위 모듈의 파이프도 볼 수 없습니다. 따라서 별도의 모듈에 파이프를 넣어야 할 수도 있습니다.

다음은 하위 모듈에 표시되지 않는 파이프를 해결하기 위해 수행 한 단계의 요약입니다.

  1. (상위) SharedModule에서 파이프를 가져와 PipeModule에 넣습니다.
  2. SharedModule에서 PipeModule 가져 오기 및 내보내기 ( 자동으로 PipeModule 에 액세스하기 위해 SharedModule 에 종속 된 앱의 다른 부분 )
  3. Sub-SharedModule의 경우 PipeModule을 가져 와서 다른 문제 중에서 순환 종속성 문제를 일으키는 SharedModule을 다시 가져올 필요없이 PipeModule에 액세스 할 수 있습니다.

위의 "교차 모듈"답변에 대한 또 다른 각주 : PipeModule을 만들 때 forRoot 정적 메서드를 제거하고 공유 모듈에없는 PipeModule을 가져 왔습니다. 내 기본적인 이해는 forRoot가 필터에 반드시 적용되지 않는 싱글 톤과 같은 시나리오에 유용하다는 것입니다.


1
추가 해주셔서 감사합니다. 이 하위 SharedModule에 추가하면 그것은 오직 나를 위해 일한
jmcgrath207을

그래, 내가 놓친 부분은 PipesModule을 Sub-SharedModule로 가져 오는 것입니다.
tenderloin

1

여기에 다른 대답을 제안 하십시오.

파이프에 대해 별도의 모듈을 만드는 것은 필수 는 아니지만 확실히 대안입니다. 공식 문서 각주 확인 : https://angular.io/guide/pipes#custom-pipes

기본 제공 파이프를 사용하는 것과 동일한 방식으로 사용자 지정 파이프를 사용합니다.
AppModule의 선언 배열에 파이프를 포함해야합니다. 파이프를 클래스에 주입하기로 선택한 경우 NgModule의 공급자 배열에 파이프를 제공해야합니다.

여러분이해야 할 일은 선언 배열에 파이프를 추가 하고 파이프를 사용하려는 곳에 공급자 배열을 추가하는 module것입니다.

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

그러나 단일 파이프는 2 개의 모듈의 일부가 될 수 없습니다 .... 위의 접근 방식은 다른 모듈에서 더 접근하기 쉽게 만듭니다.
Himanshu Bansal

0

노트 : 각도 모듈을 사용하지 않는 경우에만

어떤 이유로 이것은 문서에는 없지만 구성 요소에서 사용자 정의 파이프를 가져와야했습니다.

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

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

1
위에 게시 한 Plunker에서 파이프는 해당 모듈의 모든 구성 요소에 대해 파이프를 사용할 수 있도록하는 앱 모듈 (구성 요소 자체에서 수행하는 것과 동일)으로 가져옵니다.
ABabin

오 그래, 실제로 커스텀 파이프를 사용하는 컴포넌트를보고 있었다. 앱 모듈에서 전역 적으로 가져올 수 있다는 것을 몰랐습니다. 감사합니다
Sumama Waheed 2016-08-18

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

1
이름 지정 규칙에 불과합니다. 파일 이름은 users-filter.pipe.ts
Sumama Waheed입니다.

2
@SachinThampan은 앵귤러가 rc5에있을 때였 기 때문일 수 있습니다. 그 이후로 특별히 NgModule을 사용하여 무언가가 변경되었다고 생각합니다. 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

파이프가있는 동일한 디렉토리에 파이프 모듈을 만들었습니다.

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

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

    export class SharedPipeModule { }   

이제 app.module에서 해당 모듈을 가져옵니다.

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

이제 중첩 된 모듈에서 동일한 항목을 가져 와서 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.