Вложенные модули в приложении Angular

Я разрабатываю приложение, которое начинает иметь много компонентов. Я хотел бы разбить компоненты на отдельные модули, чтобы модуль приложения не перечислял много-много компонентов, а код становился неорганизованным.

У меня есть компонент ImageUploadComponent, который я планирую использовать в нескольких других компонентах.

Я создал модуль ProductsModule, который импортирует и объявляет все компоненты, которые конкретно относятся к продуктам.

import { ProductsComponent }       from './products.component';
import { ProductDetailComponent }  from './product-detail.component';

...

@NgModule({
  declarations: [
      ProductsComponent,
      ProductDetailComponent
  ],
  ...
})
export class ProductsModule { }

В app.module я импортирую и ProductsModule, и ImageUploadComponent:

import { ProductsModule } from './products/products.module';
import { ImageUploadComponent } from './shared/image_upload.component';
...
@NgModule({
  declarations: [
    ...
    ImageUploadComponent,
  ],
  imports: [
    ...
    ProductsModule,
  ],
  ...
})
export class AppModule { ... }

Однако, ProductsModule не знает о ImageUploadComponent, и, таким образом, попытка использовать ImageUploadComponent внутри ProductsComponent приводит к ошибке.

Как разбить мой код на отдельные модули в Angular2 таким образом, чтобы общий компонент можно было использовать во всех модулях?

Моя версия Angular - 2.1.1.

1 ответ

Решение

Вы должны создать модуль для ImageUploadComponent и импортировать его в AppModule а также ProductsModule,

Чтобы вы могли использовать компонент внутри другого модуля, вы должны экспортировать компонент, что-то вроде:

import { ImageUploadComponent } from './shared/image_upload.component';
...
@NgModule({
  declarations: [
    ImageUploadComponent,
  ],
  exports: [
    ...
    ImageUploadComponent, // Here you dispose the component to other modules
  ],
  ...
})
export class ImageUploadModule { ... }

Почему бы не загрузить его только в ProductsModule? Потому что, если вы не загрузите его в appModule вы в конечном итоге с экземпляром ImageUploadComponent в каждом модуле, который импортирует его.

Angular делит экземпляры между родительским и дочерним модулями, а не между братьями.

Другие вопросы по тегам