Почему мой подчиненный модуль NgModule не видит пользовательский канал, определенный в root NgModule? - PullRequest
0 голосов
/ 01 февраля 2020

Я работаю над большим проектом, в котором есть общий модуль для повторно используемых компонентов. В этом модуле много компонентов, и я пытаюсь сгруппировать некоторые связанные компоненты в подмодули для повторного использования функциональности и организации.

Моя проблема заключается в том, что при создании подмодуля я получаю некоторые ошибки в некоторые компоненты субмодуля. Например, один компонент использует пользовательский канал, который также находится в /shared/. Теперь, когда компонент находится в своем подмодуле, он не видит, что этот пользовательский канал доступен, где, как и раньше, проблем не было.

Вот грубый пример того, о чем я говорю ... это не так не включает /shared/, но для простоты предположим, что app.module является «общим» модулем.

https://stackblitz.com/edit/angular-9fxvp6

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Код, которым вы поделились на stackblitz, должен работать. В приложении доступно все, что находится внутри app.module. Нет необходимости экспортировать канал из app.module. но если вы планируете переместить канал в общий модуль, следуйте подходу, предложенному PierreDu c. Поэтому, если у вас есть общий компонент и общий канал, они в идеале должны находиться в одном модуле. Назовите его общим модулем. Надеюсь, это поможет.

0 голосов
/ 01 февраля 2020

Чтобы использовать канал в двух разных NgModule, вам нужно создать общий модуль .

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

@NgModule({
 imports:      [ CommonModule ],
 declarations: [ CapitalizePipe ],
 exports:      [ CapitalizePipe ]
})
export class SharedModule {}

Чтобы уточнить наше обсуждение. Как только вы импортируете два отдельных общих модуля в другой модуль (скажем, AppModule), это не означает, что все, что вы объявили в одном из этих подмодулей, доступно в другом модуле. Вам нужно строго импортировать в модуль то, что вы хотите.

Великолепная покраска

enter image description here

Если эти двум подмодулям нужно что-то из массива declarations, вы должны создать другой модуль, объявить его в этом другом модуле, добавить его в экспорт этого другого модуля и импортировать этот модуль как в подмодул # 1, так и в подмодул # 2:

enter image description here

Имея это в виду, вы можете принять следующее (все из деклараций @NgModule):

  1. Все, что находится в массиве exports субмодуля № 3, будет доступно для использования в шаблонах субмодуля № 1, субмодуля № 2 и Appmodule. Вы можете добавить все, что у вас есть в объявлениях подмодуля № 3, в массив экспорта, но лучше всего поместить туда то, что вы хотите, доступное для внешнего мира.

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

  2. Все в массиве экспорта подмодуля # 1 будет доступно только для использования в шаблонах, объявленных в AppModule (опять же, а также в подмодуле # 1).

  3. Все в массиве экспорта подмодуля # 2 будет доступно только для использования в шаблонах, объявленных в AppModule (опять же, а также в подмодуле # 2).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...