navigationend - router events subscribe angular 4
Angular 2 Usa el componente de otro módulo (4)
Tengo la aplicación Angular 2 (versión 2.0.0 - final) generada con angular-cli.
Cuando creo un componente y lo AppModule
la matriz de declaraciones de AppModule
todo está bien, funciona.
Decidí separar los componentes, así que creé un TaskModule
y un componente TaskCard
. Ahora quiero usar la TaskCard
en uno de los componentes del AppModule
(el componente de la Board
).
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{}
Todo el proyecto está disponible en https://github.com/evgdim/angular2 (carpeta kanban-board)
¿Qué me estoy perdiendo? ¿Qué tengo que hacer para usar TaskCardComponent
en BoardComponent
?
Intenta exportarlo:
@NgModule({
declarations: [TaskCardComponent],
imports: [MdCardModule],
exports: [TaskCardComponent] <== this line
})
export class TaskModule{}
¿Qué debo exportar?
Exportar clases declarables que los componentes de otros módulos deberían poder referenciar en sus plantillas. Estas son tus clases públicas. Si no exporta una clase, se mantiene privada, visible solo para otros componentes declarados en este módulo.
En el momento en que crea un módulo nuevo, flojo o no, cualquier módulo nuevo y declara algo en él, ese nuevo módulo tiene un estado limpio (como dijo Ward Bell en https://devchat.tv/adv-in-angular/119-aia-avoiding-common-pitfalls-in-angular2 )
Angular crea un módulo transitivo para cada uno de los @NgModule
s.
Este módulo recopila directivas que, o bien se importan de otro módulo (si el módulo transitivo del módulo importado tiene directivas exportadas) o se declaran en el módulo actual .
Cuando la plantilla de compilación angular pertenece al módulo X
, se utilizan aquellas directivas que se han recopilado en X.transitiveModule.directives .
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
De esta manera de acuerdo con la imagen de arriba
YComponent
no puede usarZComponent
en su plantilla porque lasdirectives
array delTransitive module Y
no contienenZComponent
porqueYModule
no ha importadoZModule
cuyo módulo transitivo contieneZComponent
en la matrizZComponent
.Dentro de la plantilla
XComponent
podemos usarZComponent
porque elTransitive module X
tiene una matriz de directivas que contieneZComponent
porqueXModule
importa el módulo (YModule
) que exporta el módulo (ZModule
) que exporta la directivaZComponent
Dentro de la plantilla de
AppComponent
no podemos usarXComponent
porqueAppModule
importaXModule
peroXModule
no exportaXComponent
.
Ver también
Lo que sea que desee utilizar de otro módulo, simplemente colóquelo en la matriz de exportación . Me gusta esto-
@NgModule({
declarations: [TaskCardComponent],
exports: [TaskCardComponent],
imports: [MdCardModule]
})
Tenga en cuenta que para crear un llamado "módulo de características", necesita importar CommonModule
dentro de él. Entonces, el código de inicialización de tu módulo se verá así:
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 { }
Más información disponible aquí: https://angular.io/guide/ngmodule#create-the-feature-module
Tienes que export
desde tu NgModule
:
@NgModule({
declarations: [TaskCardComponent],
exports: [TaskCardComponent],
imports: [MdCardModule],
providers: []
})
export class TaskModule{}