Không thể tìm thấy đường ống '' đường ống tùy chỉnh angle2


105

Tôi dường như không thể sửa lỗi này. Tôi có một thanh tìm kiếm và một ngFor. Tôi đang cố gắng lọc mảng bằng cách sử dụng một đường ống tùy chỉnh như sau:

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

Sử dụng:

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

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

Lỗi:

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

Phiên bản Angular:

"@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
Bạn đã bao gồm nó trong các Đường ống của Thành phần?
Harry Ninh

Tôi chỉ nhận ra đó là lý do. Tại sao ví dụ về góc cạnh cho đường ống tùy chỉnh lại không bao giờ thực hiện điều này: angle.io/resources/live-examples/pipes/ts/plnkr.html
Sumama Waheed

Họ định nghĩa nó là đường ống toàn cầu. Bạn có thể làm điều tương tự với đường ống tùy chỉnh của mình nếu bạn sử dụng nó ở nhiều nơi và không muốn xác định trong mọi chú thích.
Harry Ninh

@SumamaWaheed Tôi khá chắc chắn rằng nó đã ở đó tại một số thời điểm trong tài liệu, nhưng bạn nói đúng là tài liệu bây giờ không đề cập / hiển thị nó.
Michelangelo

Câu trả lời:


144

Đảm bảo rằng bạn không gặp phải sự cố "mô-đun chéo"

Nếu thành phần đang sử dụng đường ống, không thuộc mô-đun đã khai báo thành phần đường ống "toàn cục" thì không tìm thấy đường ống và bạn nhận được thông báo lỗi này.

Trong trường hợp của tôi, tôi đã khai báo đường ống trong một mô-đun riêng biệt và nhập mô-đun ống này vào bất kỳ mô-đun nào khác có các thành phần sử dụng đường ống.

Tôi đã khai báo rằng thành phần mà bạn đang sử dụng đường ống là

mô-đun ống

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

Cách sử dụng trong một mô-đun khác (ví dụ: app.module)

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

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

6
Giải pháp này là giải pháp duy nhất phù hợp với tôi. Lần lượt ra ống được yêu cầu phải có một mô-đun
AJ Zane

Tôi cũng tìm thấy điều này để giải quyết một phần lỗi không tìm thấy đường ống của tôi trong Ng 2.8. * Ngoài ra, tôi có "cảnh báo" chỉ định kiểu chỉ liên quan đến các quy ước đặt tên đang được sử dụng, sau khi giải quyết chúng, đã góp phần vào việc chuyển đổi đường ống tùy chỉnh này một cách chính xác và cuối cùng được tìm thấy trong mẫu.
CNSKnight

Đây thực sự là giải pháp duy nhất phù hợp với tôi! Tôi đã thử toàn bộ mô-đun được chia sẻ, nhưng giải pháp này hoạt động như một sự quyến rũ. Xin cảm ơn @Karl!
lulu88

làm thế nào để chúng tôi kiểm tra này trong bài kiểm tra thành phần của chúng tôi,
Apoorva

2
Cảm ơn! Vấn đề của tôi là tôi đã bỏ lỡ "xuất khẩu: [myPipe]" khi nghĩ rằng xuất khẩu chỉ dành cho mô-đun!
Rafique Mohammed

55

Bạn cần đưa đường ống của mình vào khai báo mô-đun:

declarations: [ UsersPipe ],
providers: [UsersPipe]

5
Chỉ cần lưu ý, ban đầu tôi chỉ đưa đường ống vào các nhà cung cấp. Điều này cần được bao gồm trong cả khai báo và trình cung cấp trong tệp mô-đun.
Greg A

Tôi đã đấu tranh cho đến khi tôi làm theo đề nghị của bạn. tôi đã lãng phí khoảng 4 giờ để chỉ tìm ra nó. Cảm ơn vì đã góp ý.
user1501382 14/04/17

5
Tại sao điều này không được ghi lại? Tài liệu cho biết You must include your pipe in the declarations array of the AppModule.: angle.io/guide/pipes . Dù sao, câu trả lời của bạn cũng giải quyết vấn đề của tôi.
Martijn

Cảm ơn, Yuvals. Tôi thêm một chi tiết: khai báo mô-đun nơi bạn cần đường ống.
Vinicios Torres

5
Cũng đừng quên bao gồm exports: [UsersPipe]nếu mô-đun sẽ được nhập bởi các mô-đun khác.
Precastic

18

Đối với Ionic, bạn có thể gặp nhiều vấn đề như @Karl đã đề cập. Giải pháp hoạt động hoàn hảo cho các trang tải lười ion là:

  1. Tạo thư mục pipe với các tệp sau: pipe.tspipe.module.ts

// nội dung pipe.ts (nó có thể có nhiều đường ống bên trong, chỉ cần nhớ

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

// nội dung pipe.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. Đưa PipesModule vào phần nhập app.module và @NgModule

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

  2. Bao gồm PipesModule trong mỗi .module.ts của bạn nơi bạn muốn sử dụng các đường ống tùy chỉnh. Đừng quên thêm nó vào phần nhập khẩu. // Thí dụ. file: pages / my-custom-page / my-custom-page.module.ts

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

  3. Đó là nó. Bây giờ bạn có thể sử dụng đường ống tùy chỉnh trong mẫu của mình. Ví dụ.

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


Đây là một cứu cánh cho ion, cảm ơn. Bởi vì "ionic create pipe ...." không tạo ra tất cả các bước cần thiết, như tạo pipe.module.ts. Cách tiếp cận của bạn đã hoạt động hoàn hảo. Lưu ý, đối với ionic v4, cần có một số thay đổi nhỏ đối với đường dẫn nhập.
royappa

1
Tôi nhận thấy rằng bạn không cần nhập trong app.module.ts, do đó, bước đó có thể được bỏ qua. Nó phải là vì nó "mô-đun được chia sẻ" dù sao cũng đang được nhập vào từng mô-đun khác khi nó cần thiết. Sẽ thật tuyệt nếu quá trình nhập app.module hoạt động trên toàn cầu, nhưng tôi đã thử và nó không thành công.
royappa

Tôi vẫn đang gặp phải vấn đề này: Tệp LỖI CONSOLE: node_modules/@angular/core/fesm5/core.js: 4002: 0 LỖI Lỗi: Uncaught (trong lời hứa): NullInjectorError: StaticInjectorError (AppModule) [ToHtmlPipe -> DomSanitizer]: StaticInjectorError (Nền tảng: lõi) [ToHtmlPipe -> DomSanitizer]: NullInjectorError: Không có nhà cung cấp nào cho DomSanitizer!
mircobabini

12

Tôi thấy câu trả lời "mô-đun chéo" ở trên rất hữu ích cho tình huống của tôi, nhưng tôi muốn mở rộng về điều đó, vì có một vấn đề khác cần xem xét. Nếu bạn có một mô-đun con, nó cũng không thể nhìn thấy các đường ống trong mô-đun mẹ trong thử nghiệm của tôi. Vì lý do đó, bạn có thể cần phải đặt các đường ống vào đó mô-đun riêng biệt.

Dưới đây là tóm tắt các bước tôi đã thực hiện để giải quyết các đường ống không hiển thị trong mô-đun con:

  1. Lấy đường ống ra khỏi SharedModule (cha) và đưa vào PipeModule
  2. Trong SharedModule, nhập PipeModule và xuất (đối với các phần khác của ứng dụng phụ thuộc vào SharedModule để tự động có quyền truy cập vào PipeModule)
  3. Đối với Sub-SharedModule, hãy nhập PipeModule, để nó có thể có quyền truy cập vào PipeModule mà không cần phải nhập lại SharedModule sẽ tạo ra vấn đề phụ thuộc vòng tròn, trong số các vấn đề khác.

Một chú thích khác cho câu trả lời "mô-đun chéo" ở trên: khi tôi tạo PipeModule, tôi đã xóa phương thức tĩnh forRoot và nhập PipeModule mà không có phương thức đó trong mô-đun được chia sẻ của tôi. Hiểu biết cơ bản của tôi là forRoot rất hữu ích cho các trường hợp như singleleton, không nhất thiết phải áp dụng cho các bộ lọc.


1
Cảm ơn bạn đã thêm điều này. Nó chỉ làm việc cho tôi khi nó đã được thêm vào Sub-SharedModule
jmcgrath207

Vâng, ở đây cũng vậy, phần tôi còn thiếu là nhập PipesModule vào Sub-SharedModule.
thăn thăn

1

Đề xuất một câu trả lời thay thế ở đây:

Việc tạo một mô-đun riêng biệt cho Ống là không bắt buộc , nhưng chắc chắn là một giải pháp thay thế. Kiểm tra chú thích chính thức của tài liệu: https://angular.io/guide/pipes#custom-pipes

Bạn sử dụng đường ống tùy chỉnh của mình giống như cách bạn sử dụng đường ống lắp sẵn.
Bạn phải đưa đường ống dẫn của mình vào mảng khai báo của AppModule. Nếu bạn chọn đưa đường ống của mình vào một lớp, bạn phải cung cấp nó trong mảng nhà cung cấp của NgModule của bạn.

Tất cả những gì bạn phải làm là thêm đường ống của mình vào mảng khai báo và mảng nhà cung cấpmodulenơi bạn muốn sử dụng Đường ống.

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

Nhưng một ống đơn không thể là một phần của 2 mô-đun .... Cách tiếp cận trên làm cho nó dễ tiếp cận hơn trong các mô-đun khác nhau.
Himanshu Bansal

0

Ghi chú : Chỉ khi bạn không sử dụng mô-đun góc

Vì một số lý do, điều này không có trong tài liệu nhưng tôi đã phải nhập đường ống tùy chỉnh trong thành phần

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

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

1
Trong Plunker bạn đã đăng ở trên, các đường ống được nhập vào mô-đun ứng dụng (chính xác như cách bạn làm với chính các thành phần), điều này làm cho đường ống có sẵn cho tất cả các thành phần trong mô-đun đó.
ABabin

Ồ được rồi, tôi đã thực sự xem xét thành phần thực sự sử dụng đường ống tùy chỉnh. Tôi không biết nó có thể được nhập toàn cầu trong mô-đun ứng dụng. Cảm ơn
Sumama Waheed

users-filter.pipe? tại sao .pipe?
Nather Webber

1
Đó chỉ là một quy ước đặt tên, các tập tin được gọi là người-filter.pipe.ts
Sumama Waheed

2
@SachinThampan có thể là bởi vì đây là khi góc trong rc5, tôi nghĩ ... mọi thứ đã thay đổi kể từ đó, đặc biệt là với NgModule. Hãy nhìn vào các tài liệu cho 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

Tôi đã tạo một mô-đun cho các đường ống trong cùng thư mục nơi các đường ống của tôi hiện diện

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

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

    export class SharedPipeModule { }   

Bây giờ nhập mô-đun đó trong app.module:

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

Bây giờ nó có thể được sử dụng bằng cách nhập cùng một mô-đun lồng nhau

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.