Можно ли использовать пользовательский канал в шаблоне компонента Angular, не указав его в объявлениях модуля? - PullRequest
0 голосов
/ 28 марта 2020

Используя Angular, возможно ли включить пользовательский канал (для использования в шаблоне) в компонент? Или это должно быть в declaration для @NgModule?

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

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Краткий ответ: каналы должны быть добавлены к declarations в модуле, чтобы он был доступен в шаблонах компонентов.

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

Сравните следующие два примера:

  1. Один модуль на компонент:
@NgModule({
  imports: [ CommonModule ],
  declarations: [ FooComponent ],
  exports:      [ FooComponent ],
})
export class FooModule { }
Один модуль для множества компонентов:
@NgModule({
  imports: [ CommonModule ],
  declarations: [ 
    FooComponen,
    BarComponent
  ],
  exports: [
    FooComponen,
    BarComponent
  ],
})
export class FooBarModule { }

Во втором примере вы не можете определить, зависит ли FooComponent от CommonModule, или * BarComponent зависит от CommonModule, или оба. В первом примере вы точно знаете, какой компонент зависит от CommonModule, поскольку существует только один. То же самое верно и для каналов:

@NgModule({
  declarations: [
    FooPipe, 
    FooComponent
  ],
  exports: [ FooComponent ],
})
export class FooModule { }

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

2 голосов
/ 28 марта 2020

Все, что доступно для шаблона (компоненты, директивы, трубы), должно быть в declaration для @NgModule. Если вы хотите, чтобы он был как можно более легким, вы все равно можете использовать канал в качестве службы, например:

import { MyPipe } from 'my/pipe';

@Component({
  selector: 'my-component'
})
class MyComponent {

  constructor(private myPipe: MyPipe) {}

  transform(value) {
    return this.myPipe.transform(value);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...