Труба '' не может быть найдена angular2 custom pipe



Я не могу исправить эту ошибку. У меня есть панель поиска и 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"
643   6  

6 ответов:

убедитесь, что вы не столкнулись проблема "перекрестного модуля"

Если компонент, который использует трубу, не принадлежит модулю, который объявил компонент трубы "глобально", то труба не найдена, и вы получите это сообщение об ошибке.

в моем случае я объявил трубу в отдельном модуле и импортировал этот модуль трубы в любой другой модуль, имеющий компоненты, использующие трубу.

Я объявил a тот компонент, в котором вы пользуемся трубой это

модуль Pipe

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

использования в другом модуле (например, приложение.модуль)

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

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

вам нужно включить вашу трубу в объявление модуля:

declarations: [ UsersPipe ],
providers: [UsersPipe]

Я нашел ответ "кросс-модуль" выше очень полезным для моей ситуации, но хотел бы расширить его, так как есть еще одна морщина для рассмотрения. Если у вас есть подмодуль, он также не может видеть трубы в Родительском модуле в моем тестировании. По этой причине вам также может потребоваться поместить трубы в отдельный модуль.

вот краткое описание шагов, которые я предпринял для решения труб, не видимых в подмодуле:

  1. возьмите трубы из (родительского) SharedModule и положить в PipeModule
  2. в SharedModule, импорт PipeModule и экспорт (для других частей приложения зависит от SharedModule для автоматического получения доступа к PipeModule)
  3. для суб-SharedModule импортируйте PipeModule, чтобы он мог получить доступ к PipeModule, без необходимости повторно импортировать SharedModule, что создаст проблему циклической зависимости, среди других проблем.

еще одна сноска к вышеупомянутому "кросс-модулю" ответ: когда я создал PipeModule я удалил статический метод forRoot и импортировал PipeModule без этого в моем общем модуле. Мое основное понимание заключается в том, что forRoot полезен для сценариев, таких как синглтоны, которые не обязательно применяются к фильтрам.

для ионного вы можете столкнуться с несколькими проблемами, как упоминал @Karl. Решение, которое работает безупречно для ионных ленивых загруженных страниц:

  1. создать каталог труб со следующими файлами:труб.ТС и труб.модуль.ТС

// труб.содержание 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;
  }
}

// труб.модуль.ТС контент

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. включить PipesModule в приложение.модуль и @NgModule импортирует раздел

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

  2. включить PipesModule в каждом из ваших .модуль.ТС, где вы хотите использовать пользовательские трубы. Не забудьте добавить его в раздел импорта. // Образец. файл: страницы/Мои пользовательские страницы/моя-таможня-страница.модуль.ТС

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

  3. вот и все. Теперь вы можете использовать свой собственный канал в шаблоне. Бывший.

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

Примечание : только если вы не используете угловые модули

по какой-то причине это не в документах, но мне пришлось импортировать пользовательский канал в компоненте

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

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

Я создал модуль для труб в том же каталоге, где присутствуют мои трубы

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

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

    export class SharedPipeModule { }   

теперь импортировать этот модуль в приложение.модуль:

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

теперь его можно использовать, импортируя то же самое во вложенный модуль

Comments

    Ничего не найдено.