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)にあります。
何が足りないの? TaskCardComponent
でBoardComponent
を使用するために必要なことは何ですか?
export
からそれをNgModule
にする必要があります。
@NgModule({
declarations: [TaskCardComponent],
exports: [TaskCardComponent],
imports: [MdCardModule],
providers: []
})
export class TaskModule{}
(角度2 - Angular 7)
コンポーネントは単一のモジュール内でのみ宣言できます。他のモジュールのコンポーネントを使用するためには、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 { }
いわゆる「機能モジュール」を作成するには、その中に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
モジュールで宣言されているコンポーネントを他のモジュールで使用する方法を解決しました。
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番目のモジュールの最初のコンポーネントを使用できます。
@yurzuiあなたには正しい解決策があり、説明に感謝します。
私は問題とこの行がありました:
エクスポート:[コンポーネント]で解決しました。
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 から入手しました。
他のモジュールから使いたいものが何であれ、それを export配列 に入れるだけです。このような-
@NgModule({
declarations: [TaskCardComponent],
exports: [TaskCardComponent],
imports: [MdCardModule]
})