Подтвердить что ты не робот

Как объявить директиву глобально для всех модулей в Angular 2?

Я разрабатываю репозиторий Github, который следует официальному уроку Angular (Tour of Heroes). Вы можете увидеть весь код здесь: https://github.com/Ismaestro/angular7-example-app

Моя проблема в том, что у меня есть директива, объявленная в главном модуле приложения (app.module), и если я использую ее внутри AppComponent, она работает хорошо (директива только выделяет текст внутри элемента DOM).

Но у меня есть еще один модуль под названием HeroesModule в AppModule, и внутри компонента этого модуля эта директива не работает. Основной код здесь:

приложение /app.module.ts

...

import { HighlightDirective } from "./shared/highlight.directive";

@NgModule({
    imports: [
        BrowserModule,
        FormsModule,
        HttpModule,
        InMemoryWebApiModule.forRoot(InMemoryDataService),
        AppRoutingModule,
        CoreModule,
        HeroesModule
    ],
    declarations: [
        AppComponent,
        HeroTopComponent,
        HighlightDirective <-------
    ],
    providers: [
        { provide: APP_CONFIG, useValue: AppConfig }
    ],
    bootstrap: [ AppComponent ]
})

...

приложение/герои /heroes.module.ts

@NgModule({
    imports: [
        CommonModule,
        FormsModule,
        HeroRoutingModule
    ],
    declarations: [
        HeroListComponent,
        HeroSearchComponent,
        HeroDetailComponent,
        HeroFormComponent
    ],
    providers: [
        HeroService
    ],
    exports: [
        HeroSearchComponent
    ]
})

приложение/общий /highlight.directive.ts

import { Directive, ElementRef, Input } from '@angular/core';

@Directive({ selector: '[tohHighlight]' })

export class HighlightDirective {
    constructor(el: ElementRef) {
        el.nativeElement.style.backgroundColor = 'yellow';
    }
}

приложение /app.component.ts

<h1 tohHighlight>{{title}}</h1> <----- HERE WORKS
<toh-nav></toh-nav>
<router-outlet></router-outlet>

приложение/герои/герой-лист/герой-list.component.ts

<div *ngIf="selectedHero">
    <h2>
        {{selectedHero.name | uppercase}} is my hero
    </h2>
    <p tohHighlight>Test</p> <----- HERE IT DOESN'T
    <button (click)="gotoDetail()">View Details</button>
</div>

Вы можете увидеть, установить и протестировать его самостоятельно в репозитории Github, если вам это нужно.

Спасибо!

4b9b3361

Ответ 1

Пример: Плункер

Если вам нужен компонент/директива для использования везде. Вы должны создать новый модуль:

если вы используете angular-cli, вы можете сгенерировать:

ng g module my-common

модуль:

@NgModule({
 declarations: [MyCommonComponent],
 exports:[MyCommonComponent]
})
export class MyCommonModule{}

важный! Экспорт позволяет использовать компоненты/директивы вне модуля.

компонент/директива:

@Component({
  selector: 'common-component',
  template: '<h1> common component</h1>'
})
export class MyCommonComponent{}

Наконец, вы можете импортировать этот модуль куда угодно, вы можете поместить его в AppModule, он позволит вам использовать его везде в вашем приложении.

например:

@NgModule({
  imports: [MyCommonModule]
})
export class AppModule{}

Удачи!

Ответ 2

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

приложения/модули/директивы/directives.module.ts

import { NgModule } from '@angular/core';
import { HighlightDirective } from './highlight.directive';

@NgModule({
  imports: [],
  declarations: [HighlightDirective],
  exports: [HighlightDirective]
})
export class DirectivesModule { }

приложения/модули/директивы/highLight.directive.ts

import { Directive, ElementRef } from '@angular/core';

@Directive({ selector: '[myHighlight]' })
export class HighlightDirective {
  constructor(el: ElementRef) {
    el.nativeElement.style.backgroundColor = 'yellow';
  }
}

приложение/модули/otherModule/другие-module.module.ts

import { DirectivesModule } from '../directives/directives.module';

@NgModule({
  imports: [
    DirectivesModule
  ],
  declarations: []
})
export class OtherModule { }