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
YComponentno puede usarZComponenten su plantilla porque lasdirectivesarray delTransitive module Yno contienenZComponentporqueYModuleno ha importadoZModulecuyo módulo transitivo contieneZComponenten la matrizZComponent.Dentro de la plantilla
XComponentpodemos usarZComponentporque elTransitive module Xtiene una matriz de directivas que contieneZComponentporqueXModuleimporta el módulo (YModule) que exporta el módulo (ZModule) que exporta la directivaZComponentDentro de la plantilla de
AppComponentno podemos usarXComponentporqueAppModuleimportaXModuleperoXModuleno 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{}