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
?
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
W ten sposób zgodnie z powyższym zdjęciem
YComponent
nie można użyćZComponent
w swoim szablonie, ponieważdirectives
TablicaTransitive module Y
nie zawieraZComponent
, ponieważYModule
nie zaimportowałZModule
, którego moduł przechodni zawieraZComponent
WexportedDirectives
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ł eksportuZComponent
W szablonie
AppComponent
nie możemy użyćXComponent
, ponieważAppModule
importujeXModule
, AleXModule
nie eksportujeXComponent
.
Zobacz też
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{}
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
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]
})
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.
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 .
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