web-dev-qa-db-ja.com

Angular 2他のモジュールのコンポーネントを使う

Angular-Cliで生成されたAngular 2(バージョン2.0.0 - 最終版)のアプリがあります。

コンポーネントを作成し、それをAppModuleの宣言配列に追加すると、すべてうまくいきます。

コンポーネントを分けることにしたので、TaskModuleとコンポーネントTaskCardを作成しました。 TaskCardのコンポーネントの1つ(AppModuleコンポーネント)で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{}

プロジェクト全体は https://github.com/evgdim/angular2 (kanban-board folder)にあります。

何が足りないの? TaskCardComponentBoardComponentを使用するために必要なことは何ですか?

152
Evgeni Dimitrov

exportからそれをNgModuleにする必要があります。

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

(角度2 - Angular 7)

コンポーネントは単一のモジュール内でのみ宣言できます。他のモジュールのコンポーネントを使用するためには、2つの簡単なタスクを実行する必要があります。

  1. 最初のモジュールのコンポーネントをエクスポートする
  2. 最初のモジュールを2番目のモジュールにインポートする

第一モジュール:

コンポーネントを用意して(これを「ImportantCopmonent」と呼びましょう)、2nd Moduleのページで再利用したいです。

@NgModule({
declarations: [
    FirstPage,
    ImportantCopmonent // <-- Enable using the component html tag in current module
],
imports: [
  IonicPageModule.forChild(NotImportantPage),
  TranslateModule.forChild(),
],
exports: [
    FirstPage,
    ImportantCopmonent // <--- Enable using the component in other modules
  ]
})
export class FirstPageModule { }

第2モジュール:

FirstPageModuleをインポートして、 "ImportantCopmonent"を再利用します。

@NgModule({
declarations: [
    SecondPage,
    Example2ndComponent,
    Example3rdComponent
],
imports: [
  IonicPageModule.forChild(SecondPage),
  TranslateModule.forChild(),
  FirstPageModule // <--- this Imports the source module, with its exports
], 
exports: [
    SecondPage,
]
})
export class SecondPageModule { }
8
Eyal c

いわゆる「機能モジュール」を作成するには、その中にCommonModuleをインポートする必要があることに注意してください。したがって、モジュール初期化コードは次のようになります。

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 { }

ここで利用できるより多くの情報: https://angular.io/guide/ngmodule#create-the-feature-module

2
nostop

モジュールで宣言されているコンポーネントを他のモジュールで使用する方法を解決しました。

Royi Namirの説明に基づきます(ありがとうございます)。遅延ロードが使用されている間、他のモジュールでモジュールで宣言されたコンポーネントを再利用するための欠けている部分があります。

1回目:それを含むモジュール内のコンポーネントをエクスポートします。

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

2番目: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{}

このように、2番目のモジュールは、コンポーネントをインポートおよびエクスポートする最初のモジュールをインポートします。

2番目のモジュールにモジュールをインポートするときには、もう一度エクスポートする必要があります。これで、2番目のモジュールの最初のコンポーネントを使用できます。

0
christianAV

@yurzuiあなたには正しい解決策があり、説明に感謝します。

私は問題とこの行がありました:

エクスポート:[コンポーネント]で解決しました。

0

1つの大きくて素晴らしいアプローチはNgModuleFactoryからモジュールをロードすることです、あなたはこれを呼び出すことによって別のモジュールの中にモジュールをロードすることができます:

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);
    });
}

here から入手しました。

0
Gaspar

他のモジュールから使いたいものが何であれ、それを export配列 に入れるだけです。このような-

 @NgModule({
  declarations: [TaskCardComponent],
  exports: [TaskCardComponent],
  imports: [MdCardModule]
})
0