Как наследовать модуль из другого модуля в Angular2?

Итак, я использую Angular 2 final (2.0.0) и скажу, что создаю WidgetsModule с кучей директив и компонентов, которые помогут мне создать мое приложение, а затем импортировать его в свой AppModule

import { NgModule }      from '@angular/core';
import { UniversalModule } from 'angular2-universal';

import { WidgetsModule } from '../../../widgets';
import { App, appRouting } from './';

@NgModule({
  imports:      [
    UniversalModule,
    WidgetsModule,
    appRouting
  ],
  providers:    [ AppPresenter ],
  declarations: [ App ],
  exports:      [ ],
  bootstrap:    [ App ]
})
export class AppModule { }

Затем я хочу использовать виджеты в дочерних модулях, например HomeModule, CartModule и т.д. Как я могу сделать виджеты доступными без необходимости импортировать WidgetsModule в каждый другой модуль?

import { NgModule }      from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms'

import { WidgetsModule } from '../../../widgets';
import { Cart, cartRouting } from './';

@NgModule({
  imports:      [
    CommonModule,
    FormsModule,
    ReactiveFormsModule,
    WidgetsModule,  //<-- I want to avoid doing this in every module
    cartRouting
  ],
  providers:    [ ],
  declarations: [ Cart ]

})
export class CartModule { }

Есть ли способ сделать это, как это делается с директивами в экспорте []?

Ответ 1

Ему непосредственно необходим доступ к его собственному WidgetsModule, так же как ему нужен прямой доступ к нему FormsModule (так или иначе). Один из способов его очистки - это экспортировать все модули, которые используются в разных местах, от SharedModule. Затем вы можете просто импортировать SharedModule всюду

@NgModule({
  exports: [
    FormsModule,
    CommonModule,
    WidgetsModule
  ]
})
class SharedModule {}

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

Затем во всех остальных модулях просто imports SharedModule. Это заканчивает тем, что очищает его много, и вам нужно только поддерживать один общий модуль.

См. также:

Ответ 2

Модули не наследуют доступ к компонентам, директивам или каналам, объявленным в других модулях. Импорт AppModule не имеет отношения к ContactModule и наоборот. Прежде чем ContactComponent может связываться с [(ngModel)], его ContactModule должен импортировать FormsModule.

source: ngmodule

Ответ 3

Я думаю, что на самом деле это не нужно, потому что WidgetsModule совпадает с FormsModule (@ angular/forms). WidgetsModule - это пользовательский модуль и FormsModule, предоставляемый angular. Это единственное различие. Оба этих модуля используются для выполнения некоторых функций.

Так что просто подумайте о том, как мы можем объявить FormsModule один раз и использовать его во всем другом модуле, если вы понимаете, что тогда проблема решена.

Просто просмотрите следующую ссылку Один единственный NgModule и кратный с Angular 2