功能模块不导出组件

zak*_*ces 11 import module typescript angular

我简单的应用程序有一个名为根模块的AppModule并命名一个功能模块HomeModule.我试图创建一个名为部件的路由HomeComponent(这是部分HomeModule),但我得到的是

Module "HomeModule" has no exported member 'HomeComponent'
Run Code Online (Sandbox Code Playgroud)

app.routing.ts

import { Routes, RouterModule } from '@angular/router'
import { HomeComponent } from './Home/home.module.ts' // HomeComponent not found

const appRoutes: Routes = [
  { path: '', component: HomeComponent }
];

export const appRoutingProviders: any[] = [

];

export const routing = RouterModule.forRoot(appRoutes);
Run Code Online (Sandbox Code Playgroud)

home.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { HomeComponent }  from './home.component.ts';

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ HomeComponent ],
  exports:      [ HomeComponent ]
})

export class HomeModule { }
Run Code Online (Sandbox Code Playgroud)

home.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'home',
  template: '<h1>Hello World</h1>'
})

export class HomeComponent { }
Run Code Online (Sandbox Code Playgroud)

为什么HomeModule不能导出其组件?

Joh*_*Siu 12

参考文献1:http: //angularjs.blogspot.com/2016/08/angular2-rc5-ngmodules-lazy-loading.html Ref2:https://angular.io/docs/ts/latest/guide/ngmodule.html #!#进口

问题1:NgModel导入/导出

import { HomeComponent } from './Home/home.module.ts' // HomeComponent not found
Run Code Online (Sandbox Code Playgroud)

home.module.ts出口HomeModule,不是HomeComponent.

@NgModule导出使导入模块可用的导出组件的Angular2 功能.功能可以是模板指令,选择器,可注射服务等.

主要组件功能是其选择器.因此,导入HomeModuleapp.module将使HomeComponent选择器home可用于任何app.module的组件.

要使HomeModule显式导出HomeComponent,需要index.js和index.d.ts.(灵感来自Fabio Antunes的回答)

使用选择器 home

要使用它,exports: [ HomeComponent ]在home.module.ts中是必需的.

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { HomeModule } from './Home/home.module';

import { routing } from './app.routing';

@NgModule({
    imports: [
        BrowserModule,
        HomeModule,
        routing],
    declarations: [
        AppComponent],
    bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

app.component.ts使用选择器home

import {Component} from '@angular/core';

@Component({
    selector: 'app-component',
    template: `
        <h1>{{title}}</h1>
        <home></home>`
})
export class AppComponent {
    title = 'APP';
}
Run Code Online (Sandbox Code Playgroud)

使用HomeComponent

要直接使用HomeComponent,我们需要将index.js和index.d.ts添加到./Home中

./Home/index.js

exports.HomeModule = require('./home.module').HomeModule;
exports.HomeComponent = require('./home.component').HomeComponent;
Run Code Online (Sandbox Code Playgroud)

./Home/index.d.ts

exports * './home.module';
exports * from './home.component';
Run Code Online (Sandbox Code Playgroud)

然后像npm包一样导入Home Module

app.routing.ts

// We are importing the module directory, not ./Home/home.module.ts
import { HomeComponent } from './Home';

import { Routes, RouterModule } from '@angular/router'

const appRoutes: Routes = [
  { path: '', component: HomeComponent }
];

export const appRoutingProviders: any[] = [

];

export const routing = RouterModule.forRoot(appRoutes);
Run Code Online (Sandbox Code Playgroud)

问题2:路由(到子模块)

要路由到模块,子模块需要有自己的路由器设置.

loadChildren在父路由中使用(app.routing.ts).

用于RouterModule.forChild子路由(home.routing.ts).

app.module.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppComponent } from './app.component';

import { HomeModule } from './Home/home.module';

import { routing } from './app.routing';

@NgModule({
    imports: [
        BrowserModule,
        HomeModule,
        routing],
    declarations: [
        AppComponent],
    bootstrap: [AppComponent]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

app.component.ts

import {Component} from '@angular/core';

@Component({
    selector: 'app-component',
    template: `
        <h1>{{title}}</h1>
        <nav>
      <a routerLink="/home" routerLinkActive="active">Home</a>
    </nav>
    <router-outlet></router-outlet>`
})
export class AppComponent {
    title = 'APP';
}
Run Code Online (Sandbox Code Playgroud)

app.routing.ts

import { Routes, RouterModule } from '@angular/router';

const appRoutes: Routes = [
    {
        path: '',
        redirectTo: '/home',
        pathMatch: 'full'
    },
    {
        path: 'home',
        loadChildren: './Home/home.module'
    }
];

export const appRoutingProviders: any[] = [

];

export const routing = RouterModule.forRoot(appRoutes);
Run Code Online (Sandbox Code Playgroud)

首页/ home.module.ts

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { HomeComponent }  from './home.component';

import { routing } from './home.routing';

@NgModule({
  imports: [
    BrowserModule,
    routing],
  declarations: [
    HomeComponent]
})

export class HomeModule { }
Run Code Online (Sandbox Code Playgroud)

首页/ home.routing.ts

import { Routes, RouterModule } from '@angular/router';

import { HomeComponent } from './home.component';

const homeRoutes: Routes = [
    {
        path: '',
        redirectTo: '/home',
        pathMatch: 'full'
    },
    {
        path: 'home',
        component: HomeComponent
    }
];

export const appRoutingProviders: any[] = [

];

export const routing = RouterModule.forChild(homeRoutes);
Run Code Online (Sandbox Code Playgroud)