2016-10-13 5 views
17

Im работает над угловым окончательным выпуском 2.Угловой 2 - Повторное использование труб в нескольких модулях - ошибка не найдена или дублирующее определение

Я объявил два модуль: главного приложения и один для настроек страницы.

Главный модуль объявляет глобальные трубы. Этот модуль также включает в себя модуль настроек.

app.module.ts

@NgModule({ 
    imports: [BrowserModule, HttpModule, routing, FormsModule, SettingsModule], 
    declarations: [AppComponent, JsonStringifyPipe], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

settings.module.ts

@NgModule({ 
    imports: [CommonModule, HttpModule, FormsModule, routing], 
    declarations: [SettingsComponent], 
    exports: [SettingsComponent], 
    providers: [] 
}) 
export class SettingsModule { } 

При попытке использовать трубу в модуле настройки я получаю сообщение об что труба не найдена.

zone.min.js?cb=bdf3d3f:1 Unhandled Promise rejection: Template parse errors: 
The pipe 'jsonStringify' could not be found ("   <td>{{user.name}}</td> 
        <td>{{user.email}}</td> 
        <td>[ERROR ->]{{user | jsonStringify}}</td> 
        <td>{{ user.registered }}</td> 
       </tr"): [email protected]:24 ; Zone: <root> ; Task: Promise.then ; Value: Error: Template parse 

Если бы я включил трубку в настройках модуля жалуется на двух модулей, имеющих такую ​​же трубу.

zone.min.js?cb=bdf3d3f:1 Error: Error: Type JsonStringifyPipe is part of the declarations of 2 modules: SettingsModule and AppModule! Please consider moving JsonStringifyPipe to a higher module that imports SettingsModule and AppModule. You can also create a new NgModule that exports and includes JsonStringifyPipe then import that NgModule in SettingsModule and AppModule. 

JSON-stringify.pipe.ts

@Pipe({name: 'jsonStringify'}) 
export class JsonStringifyPipe implements PipeTransform { 
    transform(object) { 
     // Return object as a string 
     return JSON.stringify(object); 
    } 
} 

Любая идея об этом?

ответ

30

Если вы хотите использовать трубу в другом модуле, а затем добавить модуль, где труба объявляется imports: [...] модуля, где вы хотите, чтобы повторно использовать трубу, вместо того, чтобы добавить его в declarations: [] многократного модули.

Например:

@NgModule({ 
    imports: [BrowserModule], 
    declarations: [JsonStringifyPipe], 
    exports: [JsonStringifyPipe] 
}) 
export class JsonStringifyModule { } 
@NgModule({ 
    imports: [ 
     BrowserModule, HttpModule, routing, FormsModule, SettingsModule, 
     JsonStringifyModule], 
    declarations: [AppComponent], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
@NgModule({ 
    imports: [ 
     CommonModule, HttpModule, FormsModule, routing, 
     JsonStringifyModule], 
    declarations: [SettingsComponent], 
    exports: [SettingsComponent], 
    providers: [] 
}) 
export class SettingsModule { } 
+1

Спасибо за ответ ... Почему мне нужно создать модуль для труб? Почему определение трубы в глобальном модуле недостаточно, чтобы сделать трубу доступной для других модулей? – kitimenpolku

+3

Почему хороший вопрос. Потому что Angular2 разработан таким образом. Наверное, это мало помогает ;-). Концепция «NgModule» была введена для ленивой загрузки с автономной компиляцией шаблонов, и я думаю, у них были веские причины ее проектировать. Угловой просто нужно знать, где используются компоненты, директивы, трубы и службы, чтобы создавать небольшой и эффективный код, который работает с ленивой загрузкой и автономной компиляцией. –

+2

Вам не нужно создавать модуль для каждой трубы. В таком модуле вы можете разместить столько многократно используемых компонентов, директив, труб и сервисов. Но вам нужно импортировать его везде, где используется одна из этих частей. –

 Смежные вопросы

  • Нет связанных вопросов^_^