Angular 2 Użyj komponentu z innego modułu

Mam aplikację Angular 2 (Wersja 2.0.0 - final) wygenerowaną za pomocą angular-cli.

Kiedy tworzę komponent i dodaję go do tablicy deklaracji AppModule to wszystko jest dobre, działa.

Postanowiłem rozdzielić komponenty, więc stworzyłem TaskModule i komponent TaskCard. Teraz chcę użyć TaskCard w jednym ze składników AppModule (Board komponentu).

AppModule:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';
import { BoardComponent } from './board/board.component';
import { LoginComponent } from './login/login.component';

import { MdButtonModule } from '@angular2-material/button';
import { MdInputModule } from '@angular2-material/input';
import { MdToolbarModule } from '@angular2-material/toolbar';

import { routing, appRoutingProviders} from './app.routing';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';

import { UserService  } from './services/user/user.service';
import { TaskModule } from './task/task.module';


@NgModule({
  declarations: [
    AppComponent,
    BoardComponent,// I want to use TaskCard in this component
    LoginComponent,
    PageNotFoundComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    MdButtonModule,
    MdInputModule,
    MdToolbarModule,
    routing,
    TaskModule // TaskCard is in this module
  ],
  providers: [UserService],
  bootstrap: [AppComponent]
})
export class AppModule { }

TaskModule:

import { NgModule } from '@angular/core';
import { TaskCardComponent } from './task-card/task-card.component';

import { MdCardModule } from '@angular2-material/card';

@NgModule({
  declarations: [TaskCardComponent],
  imports: [MdCardModule],
  providers: []
})
export class TaskModule{}

Cały projekt jest dostępny na https://github.com/evgdim/angular2 (kanban-Board folder)

Co mi umyka? Co muszę zrobić, aby użyć TaskCardComponent w BoardComponent?

Author: Evgeni Dimitrov, 2016-09-20

6 answers

Główna zasada jest taka, że:

Selektory, które mają zastosowanie podczas kompilacji szablonu komponentu, są określane przez moduł, który deklaruje ten komponent, oraz przejściowe zamknięcie eksportu importu tego modułu.

Więc spróbuj go wyeksportować:

@NgModule({
  declarations: [TaskCardComponent],
  imports: [MdCardModule],
  exports: [TaskCardComponent] <== this line
})
export class TaskModule{}

Co powinienem wyeksportować?

Eksport klas, które komponenty w innych modułach powinny być możliwość odwoływania się do swoich szablonów. Są to Twoje publiczne zajęcia. Jeśli nie wyeksportujesz klasy, pozostanie ona prywatna, widoczna tylko dla innych komponent zadeklarowany w tym module.

w momencie, gdy utworzysz nowy moduł, leniwy czy nie, każdy nowy moduł i zadeklarujesz w nim cokolwiek, nowy moduł ma stan czysty(jak powiedział Ward Bell w https://devchat.tv/adv-in-angular/119-aia-avoiding-common-pitfalls-in-angular2 )

Angular tworzy moduł przechodni dla każdego z @NgModule s.

Ten moduł zbiera dyrektywy, które zostały zaimportowane z innego modułu (jeśli moduł przechodni importowanego modułu ma wyeksportowane dyrektywy) lub zadeklarowane w bieżącym module.

Gdy angular kompiluje szablon, który należy do modułu X używa się tych dyrektyw, które zostały zebrane w X. transitiveModule.dyrektywy .

compiledTemplate = new CompiledTemplate(
    false, compMeta.type, compMeta, ngModule, ngModule.transitiveModule.directives);

Https://github.com/angular/angular/blob/4.2.x/packages/compiler/src/jit/compiler.ts#L250-L251

Tutaj wpisz opis obrazka

W ten sposób zgodnie z powyższym zdjęciem

  • YComponent nie można użyć ZComponent w swoim szablonie, ponieważ directives Tablica Transitive module Y nie zawiera ZComponent, ponieważ YModule nie zaimportował ZModule, którego moduł przechodni zawiera ZComponent W exportedDirectives tablicy.

  • Wewnątrz XComponent szablon możemy użyć ZComponent ponieważ Transitive module X ma tablicę dyrektyw zawierającą ZComponent ponieważ XModule moduł importu (YModule) Moduł eksportu (ZModule) Moduł eksportu ZComponent

  • W szablonie AppComponent nie możemy użyć XComponent, ponieważ AppModule importuje XModule, Ale XModule nie eksportuje XComponent.

Zobacz też

 244
Author: yurzui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-23 04:40:01

Musisz export to z twojego NgModule:

@NgModule({
  declarations: [TaskCardComponent],
  exports: [TaskCardComponent],
  imports: [MdCardModule],
  providers: []
})
export class TaskModule{}
 25
Author: mxii,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 18:58:41

Zauważ, że aby utworzyć tak zwany "moduł funkcji", musisz zaimportować CommonModule do niego. Tak więc Twój kod inicjalizacji modułu będzie wyglądał następująco:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { TaskCardComponent } from './task-card/task-card.component';
import { MdCardModule } from '@angular2-material/card';

@NgModule({
  imports: [
    CommonModule,
    MdCardModule 
  ],
  declarations: [
    TaskCardComponent
  ],
  exports: [
    TaskCardComponent
  ]
})
export class TaskModule { }

Więcej informacji można znaleźć tutaj: https://angular.io/guide/ngmodule#create-the-feature-module

 1
Author: nostop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 14:11:53

Cokolwiek chcesz użyć z innego modułu, po prostu umieść go w export array. Like this -

 @NgModule({
  declarations: [TaskCardComponent],
  exports: [TaskCardComponent],
  imports: [MdCardModule]
})
 0
Author: Abhishek Chandel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-25 17:42:09

ROZWIĄZANO SPOSÓB UŻYCIA KOMPONENTU ZADEKLAROWANEGO W MODULE W INNYM MODULE.

Na podstawie wyjaśnienia Royi Namir (Dziękuję bardzo). Brakuje części do ponownego użycia komponentu zadeklarowanego w Module w dowolnym innym module podczas leniwego ładowania.

1st: Eksportuj komponent w module, który go zawiera:

@NgModule({
  declarations: [TaskCardComponent],
  imports: [MdCardModule],
  exports: [TaskCardComponent] <== this line
})
export class TaskModule{}

2nd: w module, w którym chcesz użyć TaskCardComponent:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { MdCardModule } from '@angular2-material/card';

@NgModule({
  imports: [
   CommonModule,
   MdCardModule
   ],
  providers: [],
  exports:[ MdCardModule ] <== this line
})
export class TaskModule{}

W ten sposób drugi moduł importuje pierwszy moduł, który importuje i eksportuje komponent.

Kiedy importujemy moduł do drugiego modułu musimy go wyeksportować ponownie. Teraz możemy użyć pierwszego komponentu w drugim module.

 0
Author: christianAV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-18 09:55:31

Jednym wielkim i wielkim podejściem jest załadowanie modułu z NgModuleFactory , możesz załadować moduł wewnątrz innego modułu, wywołując to:

constructor(private loader: NgModuleFactoryLoader, private injector: Injector) {}

loadModule(path: string) {
    this.loader.load(path).then((moduleFactory: NgModuleFactory<any>) => {
        const entryComponent = (<any>moduleFactory.moduleType).entry;
        const moduleRef = moduleFactory.create(this.injector);
        const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(entryComponent);
        this.lazyOutlet.createComponent(compFactory);
    });
}

Mam to z tutaj .

 0
Author: Gaspar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-04 17:10:22