如何全局声明管道以在不同模块中使用?
How to declare a pipe globally to use in different modules?
我有一个名为 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
中使用它时,它会抛出错误
The pipe 'currConvert' could not be found
你应该制作一个模块,即 SharedModule
并在那里声明你的管道。然后你应该在 SharedModule
中导出管道并在 Module1
和 Module2
中导入你的 SharedModule
。 Angular 的文档中有一篇很棒的文章:https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-module
在Angular中,共享通用指令、组件、管道等的一个好方法是使用所谓的共享模块。
这些模块声明并导出公共部分,使它们可用于您的任何其他模块。
The fundamentals section of the angular documentation is a very good read about shared modules.
让我们以您的 currConvert
管道为例。
声明名为 ApplicationPipesModule
的新 NgModule
将管道添加到 NgModule
-装饰器元数据的 declarations
和 exports
数组
将管道工作所需的任何模块添加到
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 {}
您可以使用共享模块来共享您的服务、指令、管道、组件
您必须创建一个模块并导入管道、指令、服务或组件,并为服务设置声明、导出和提供程序。
将共享模块导入到任何你想要的地方并使用它。
基本上是在 NgModules 元数据中声明和导出的管道和指令。
对于服务定义 forRoot 其中 returns 供应商访问其他模块。
shareModule.ts
import { NgModule, ModuleWithProviders } from '@angular/core';
import { appDirective } from './{your-path}';
import { appPipe } from './{your-path}';
import { appService } from './{your-path}';
@NgModule({
declarations: [
appPipe,
appDirective
],
exports: [
appPipe,
appDirective
]
})
export class SharingModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: SharingModule,
providers: [ appService ]
};
}
}
我的-module1.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { myComponent } from './{your-path}';
import { SharingModule } from './{your-path}';
@NgModule({
declarations: [
myComponent
],
imports: [
BrowserModule,
SharingModule.forRoot()
],
})
export class AppModule {}
同样,您也可以在其他模块中进行。
如果您使用 CLI 为共享模块生成管道,您需要手动将管道添加到 'exports' 列表。我的管道在浏览器中出错,直到我将管道作为导出添加到我的共享模块中,我 imported/declared 它在。
考虑你有这个结构:
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
不会在管道之前加载,因此它会引发错误。
我有一个名为 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
中使用它时,它会抛出错误
The pipe 'currConvert' could not be found
你应该制作一个模块,即 SharedModule
并在那里声明你的管道。然后你应该在 SharedModule
中导出管道并在 Module1
和 Module2
中导入你的 SharedModule
。 Angular 的文档中有一篇很棒的文章:https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-module
在Angular中,共享通用指令、组件、管道等的一个好方法是使用所谓的共享模块。
这些模块声明并导出公共部分,使它们可用于您的任何其他模块。
The fundamentals section of the angular documentation is a very good read about shared modules.
让我们以您的 currConvert
管道为例。
声明名为
ApplicationPipesModule
的新 NgModule
将管道添加到
NgModule
-装饰器元数据的declarations
和exports
数组将管道工作所需的任何模块添加到
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 {}
您可以使用共享模块来共享您的服务、指令、管道、组件
您必须创建一个模块并导入管道、指令、服务或组件,并为服务设置声明、导出和提供程序。
将共享模块导入到任何你想要的地方并使用它。
基本上是在 NgModules 元数据中声明和导出的管道和指令。 对于服务定义 forRoot 其中 returns 供应商访问其他模块。
shareModule.ts
import { NgModule, ModuleWithProviders } from '@angular/core'; import { appDirective } from './{your-path}'; import { appPipe } from './{your-path}'; import { appService } from './{your-path}'; @NgModule({ declarations: [ appPipe, appDirective ], exports: [ appPipe, appDirective ] }) export class SharingModule { static forRoot(): ModuleWithProviders { return { ngModule: SharingModule, providers: [ appService ] }; } }
我的-module1.module.ts
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { myComponent } from './{your-path}'; import { SharingModule } from './{your-path}'; @NgModule({ declarations: [ myComponent ], imports: [ BrowserModule, SharingModule.forRoot() ], }) export class AppModule {}
同样,您也可以在其他模块中进行。
如果您使用 CLI 为共享模块生成管道,您需要手动将管道添加到 'exports' 列表。我的管道在浏览器中出错,直到我将管道作为导出添加到我的共享模块中,我 imported/declared 它在。
考虑你有这个结构:
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
不会在管道之前加载,因此它会引发错误。