Кажется, я не могу исправить эту ошибку. У меня есть панель поиска и 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"
angular
angular2-forms
angular2-pipe
Сумама Вахид
источник
источник
Ответы:
Убедитесь, что вы не столкнулись с проблемой "кросс-модуля"
Если компонент, использующий канал, не принадлежит модулю, который объявил компонент канала «глобально», тогда канал не найден, и вы получите это сообщение об ошибке.
В моем случае я объявил канал в отдельном модуле и импортировал этот модуль канала в любой другой модуль, имеющий компоненты, использующие канал.
Я заявил, что компонент, в котором вы используете канал, является
Модуль трубы
Использование в другом модуле (например, app.module)
источник
Вам необходимо включить свой канал в объявление модуля:
источник
You must include your pipe in the declarations array of the AppModule.
: angular.io/guide/pipes . Во всяком случае, ваш ответ также решает мою проблему.exports: [UsersPipe]
ли модуль импортирован другими модулями.Для Ionic вы можете столкнуться с несколькими проблемами, как упоминал @Karl. Решение, которое безупречно работает для ионных ленивых страниц:
// содержимое pipe.ts (внутри может быть несколько каналов, просто не забудьте
// содержимое pipe.module.ts
Включите PipesModule в раздел импорта app.module и @NgModule
import { PipesModule } from "../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] });
Включите PipesModule в каждый из ваших .module.ts, где вы хотите использовать настраиваемые каналы. Не забудьте добавить его в раздел импорта. // Пример. файл: pages / my-custom-page / my-custom-page.module.ts
import { PipesModule } from "../../pipes/pipes.module"; @NgModule({ imports: [ PipesModule ] })
Это оно. Теперь вы можете использовать свой собственный канал в своем шаблоне. Ex.
<div *ngFor="let prop of myObject | toArray">{{ prop.key }}</div>
источник
Я нашел приведенный выше ответ "кросс-модуль" очень полезным для моей ситуации, но хотел бы остановиться на нем, так как есть еще одна проблема. Если у вас есть подмодуль, он также не может видеть каналы в родительском модуле в моем тестировании. По этой же причине вам может потребоваться поместить трубы в отдельный модуль.
Вот краткое изложение шагов, которые я предпринял для решения проблем с каналами, которые не отображаются в подмодуле:
Еще одна сноска к приведенному выше ответу "кросс-модуля": когда я создал PipeModule, я удалил статический метод forRoot и импортировал PipeModule без него в свой общий модуль. Я понимаю, что forRoot полезен для таких сценариев, как синглтоны, которые не обязательно применяются к фильтрам.
источник
Предлагая альтернативный ответ здесь:
Изготовление отдельного модуля для трубы не требуется , но это определенно альтернатива. См. Сноску в официальной документации: https://angular.io/guide/pipes#custom-pipes
Все, что вам нужно сделать, это добавить свой канал в массив объявлений и массив поставщиков в том месте,
module
где вы хотите использовать канал.источник
Примечание: только если вы не используете модули angular
По какой-то причине этого нет в документации, но мне пришлось импортировать настраиваемый канал в компонент
источник
источник
Я создал модуль для каналов в том же каталоге, где находятся мои трубы.
Теперь импортируйте этот модуль в app.module:
Теперь его можно использовать, импортировав то же самое во вложенный модуль.
источник