我有一个名为 CurrConvertPipe
import {Pipe, PipeTransform} from '@angular/core';
import {LocalStorageService} from './local-storage';
@Pipe({name: 'currConvert', pure: false})
export class CurrConvertPipe implements PipeTransform {
constructor(private currencyStorage: LocalStorageService) {}
transform(value: number): number {
let inputRate = this.currencyStorage.getCurrencyRate('EUR');
let outputputRate = this.currencyStorage.getCurrencyRate(localStorage.getItem('currency'));
return value / inputRate * outputputRate;
}
}
我需要在两个不同的模块Module1
和Module2
中使用它
当我导入Module1
和Module2
时,我收到一条错误消息,说它应该在更高级别的模块中声明。
所以我在 app.module.ts
import './rxjs-extensions';
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { CurrConvertPipe } from './services/currency/currency-pipe';
@NgModule({
imports: [
BrowserModule,
FormsModule,
HttpModule,
AppRoutingModule,
Module1,
Module2
],
declarations: [
AppComponent,
CurrConvertPipe
],
providers: [
],
bootstrap: [AppComponent]
})
export class AppModule { }
但是当我在Module1
中使用它时,会抛出错误
无法找到管道'currConvert'
答案 0 :(得分:86)
在Angular中,一种分享通用指令,组件,管道等的好方法是使用所谓的共享模块。
这些模块声明并导出公共部分,以使它们可用于任何其他模块。
角度文档的fundamentals section是关于共享模块的非常好的读物。
让我们以currConvert
管道为例。
声明名为ApplicationPipesModule
将管道添加到declarations
- {decorator元数据
exports
和NgModule
数组中
添加管道可能需要的任何模块
imports
数组
// application-pipes.module.ts
// other imports
import { CurrConvertPipe } from './{your-path}';
@NgModule({
imports: [
// dep modules
],
declarations: [
CurrConvertPipe
],
exports: [
CurrConvertPipe
]
})
export class ApplicationPipesModule {}
将创建的ApplicationPipesModule
模块导入到将要使用管道的模块中,方法是将其添加到imports
数组
// my-module1.module.ts
// other imports
import { ApplicationPipesModule } from './{your-path}';
@NgModule({
imports: [
// other dep modules
ApplicationPipesModule
],
declarations: [],
exports: []
})
export class MyModule1 {}
答案 1 :(得分:4)
您应该创建一个模块,即SharedModule
并在那里声明您的管道。然后,您应该在SharedModule
中导出管道,并在SharedModule
和Module1
中导入Module2
。 Angular的文档中有一篇很棒的文章:https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-module
答案 2 :(得分:1)
考虑您具有以下结构:
app
-shared
-components
-DateComponentModule.ts
-pipes
-DatesPipe
-DatesPipeModule.ts
-SharedModule.ts
在DateComponentModule中使用DatesPipeModule时。
在DatesPipeModule中声明和导出DatesPipe
现在将DatesPipeModule直接导入DateComponentModule。
DatesPipeModule.ts
import { DatesPipe} from './{your-path}';
@NgModule({
imports: [],
declarations: [
DatesPipe
],
exports: [
DatesPipe
]
})
export class DatesPipeModule{}
DateComponentModule.ts
import { DatesPipeModule} from './{your-path}';
@NgModule({
imports: [DatesPipeModule],
declarations: [],
exports: []
})
export class DatesPipeModule{}
您也可以从SharedModule
导出并将其导入DatesComponentModule.ts
,但是SharedModule
不会在管道之前加载,因此会引发错误。
答案 3 :(得分:0)
如果使用CLI为共享模块生成管道,则需要将管道手动添加到“导出”列表中。在浏览器中出现管道错误,直到将管道作为导出添加到导入/声明的共享模块中为止。