2017-03-03 69 views
9

现在我有一个自定义的管道创建的名为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; 
    } 
} 

我需要在两个不同的模块来使用,

(i) Module1 
(ii) Module2 

,当我在模块1 1和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 { } 

但是,当我在模块1使用它,它抛出一个错误的管“currConvert”找不到

回答

27

在Angular中,共享常用指令,组件,管道等的一种很好的技术是使用所谓的共享模块

这些模块声明和导出公共部分,使它们可用于任何其他模块。

角文档的fundamentals section是有关共享模块非常好读。

让我们以您的currConvert-管为例。


  • 声明新NgModule称为ApplicationPipesModule
  • 管道添加到NgModule -decorator元数据的declarationsexports阵列
  • 添加您的管道工作的imports可能需要的任何模块阵列

// other imports 
import { CurrConvertPipe } from './{your-path}'; 

@NgModule({ 
    imports: [ 
    // dep modules 
    ], 
    declarations: [ 
    CurrConvertPipe 
    ], 
    exports: [ 
    CurrConvertPipe 
    ] 
}) 
export class ApplicationPipesModule {} 

应用pipes.module.ts


  • 导入所创建的ApplicationPipesModule模块插入其中的管会模块中使用,通过将其添加到imports阵列

// other imports 
import { ApplicationPipesModule } from './{your-path}'; 

@NgModule({ 
imports: [ 
    // other dep modules 
    ApplicationPipesModule 
], 
declarations: [], 
exports: [] 
}) 
export class MyModule1 {} 

my-module1.module。TS


// other imports 
import { ApplicationPipesModule } from './{your-path}'; 

@NgModule({ 
imports: [ 
    // other dep modules 
    ApplicationPipesModule 
], 
declarations: [], 
exports: [] 
}) 
export class MyModule2 {} 

我-module2.module.ts

编辑:改进答复文件和榜样。

4

你应该做一个模块,即SharedModule并在那里声明你的管道。那么你应该在SharedModule中输出管道,并在Module1Module2中输入你的SharedModule。在Angular的文档中有一篇很棒的文章:https://angular.io/docs/ts/latest/guide/ngmodule.html#!#shared-module

+0

@Sajeetharan app.module _imports_'Module1'和'Module2',所以pipe在这些模块中不会被导入。如果您在'Module1'中导入'SharedModule',则管道将被导入到'SharedModule'中并导出到'Module1' – Ledzz