Как сделать директивы и компоненты доступными во всем мире

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

import { Directive, ElementRef, HostListener, Injectable } from '@angular/core'; @Directive({ selector: '[myCloseContentPanel]' }) export class CloseContentPanelDirective { private el: HTMLElement; constructor(el: ElementRef) { this.el = el.nativeElement; } @HostListener('click') onMouseClick() { this.el.style.display = 'none'; } } 

Теперь я ожидал, что смогу импортировать эту директиву один раз в родительский компонент app.component и что тогда я могу использовать эту директиву для всех дочерних компонентов. Это, к сожалению, не работает, поэтому мне придется импортировать эту директиву в каждом компоненте отдельно. Я делаю что-то неправильно? Или это поведение просто невозможно?

update> = RC.5

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

Вы можете создать модуль, который экспортирует несколько других модhive (например, BrowserModule который экспортирует CommonModule .

 @NgModule({ declarations: [CoolComponent, CoolDirective, CoolPipe], imports: [MySharedModule1, MySharedModule2], exports: [MySharedModule1, MySharedModule2, CoolComponent, CoolDirective, CoolPipe], }) export class AllInOneModule {} @NgModule({ imports: [AllInOneModule] }) class MyModule {} 

Таким образом вы делаете все экспортируемое AllInOneModule доступным для MyModule .

См. Также https://angular.io/docs/ts/latest/guide/ngmodule.html.

обновление <= RC.5

 bootstrap(AppComponent, [provide(PLATFORM_DIRECTIVES, {useValue: [CloseContentPanelDirective], multi: true})]); 

См. Комментарии ниже – даже если для providers стилей в корневом компоненте должно быть предпочтительнее boostrap() это не работает:

оригинал

На корневой компонент добавить

 @Component({ selector: 'my-app', providers: [provide(PLATFORM_DIRECTIVES, {useValue: [CloseContentPanelDirective], multi: true})], templat: `...` }) export component AppComponent { } 

@Component() , @Directive() , @Pipe() уже include @Injectable() . Не нужно также добавлять его туда.

  • Как выбрать элемент в шаблоне компонента?
  • Angular2 - Взаимодействие между компонентами с использованием сервиса
  • Как передавать данные между отдельными компонентами без использования $ scope?
  • Угловой 2 - Услуги, требующие других услуг до вызова метода
  • Angular2 - Параметры запроса HTTP-запроса
  • Как глубоко наблюдать массив в angularjs?
  • Угловой - общий сервис между компонентами не работает
  • Как получить объект Date из json Response в машинописном тексте
  • Угловой HTTP GET с ошибкой TypeScript http.get (...) .map не является функцией в
  • AngularJS выполняет HTTP-запрос OPTIONS для кросс-исходного ресурса
  • Угловая 2 - Использование общей службы
  • Давайте будем гением компьютера.