Ionic 3のページにカスタムコンポーネントをインポートするのに行き詰まっています。これは、Ionic 2では比較的簡単でしたが、動作させることができないようです。 in Ionic 3。
other
という名前の既存のページモジュールがあります。ionic g component test
を実行した後、自動生成されたComponentsModule
をother.module.ts
にインポートし、それをimports
配列に追加します。
import { ComponentsModule } from "../../components/components.module";
@NgModule({
declarations: [
OtherPage,
],
imports: [
IonicPageModule.forChild(OtherPage),
ComponentsModule,
],
})
export class OtherPageModule {}
次に、コンポーネントセレクターを<test></test>
としてページに追加します。
これはエラーになります:
polyfills.js:3 Unhandled Promise rejection: Template parse errors:
'test' is not a known element:
1. If 'test' is an Angular component, then verify that it is part of this module.
2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component. ("
<ion-content padding>
[ERROR ->]<test> </test>
</ion-content>
"): ng:///AppModule/OtherPage.html@16:0 ; Zone: <root> ; Task: Promise.then ; Value: Error: Template parse errors:
'test' is not a known element:
1. If 'test' is an Angular component, then verify that it is part of this module.
これは私にはうまくいきません。また、テストコンポーネント用にmodule
を作成し、同じ方法でインポートしようとしましたが、これは機能しません。
これに関するドキュメントや例が見つからないようです。カスタムコンポーネントはIonic 3にどのようにインポートされますか?
これが私がそれを解決した方法です:
CustomComponent
をエクスポートするとします。以下に示すように、custom-component.module.tsで同じものをインポートします。
import { CustomComponent } from './custom-component';
@NgModule({
declarations: [
CustomComponent,
],
imports: [
IonicPageModule.forChild(CustomComponent),
],
exports : [ CustomComponent ]
})
export class CustomComponentPageModule { }
次に、以下に示すように、カスタムコンポーネントを目的のページにインポートします。
import { ContentDrawerPageModule } from '../../../components/custom-component/custom-component.module';
@NgModule({
declarations: [
HelloWorldPage,
],
imports: [
IonicPageModule.forChild(HelloWorldPage),
CustomComponentPageModule,
]
})
export class HelloWorldPageModule {}
これで、カスタムコンポーネント(CustomComponent
)がページに正常にインポートされました(HelloWorldPage)。
ここに示されているように https://github.com/ionic-team/ionic/issues/1156
残念ながら、遅延ロードコンポーネント、ディレクティブ、パイプを作成する方法はありません。とにかくあなたがそれを管理するかどうか私たちに知らせてください。
したがって、ComponentsModuleをpage.module.tsにインポートできます。これが私のものです。
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { ComponentsModule } from ../../components/components.module';
@NgModule({
declarations: [
WoDetailsPage,
],
imports: [
ComponentsModule,
IonicPageModule.forChild(WoDetailsPage),
],
})
export class WoDetailsPageModule {}
test
コンポーネントをエクスポートする必要があります。
@NgModule({
declarations: [
TestComponent,
],
imports: [],
exports: [TestComponent]
})
export class ComponentModule {}
これは私が以下のリンクをたどることによってそれを解決した方法です:
http://evalogical.com/blog/components-ionic-framework-
このようにhome.ts
ファイルにコンポーネントをインポートします。import { MyComponent } from '../../components/my/my';
home.module.ts
でComponentsModule
をインポートし、次のようにインポートに追加します。
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { HomePage } from './home';
import { ComponentsModule } from '../../components/components.module';
@NgModule({
declarations: [
HomePage,
],
imports: [
IonicPageModule.forChild(HomePage),
ComponentsModule
],
})
export class HomePageModule {}
IonicPageModuleをcomponents.module.ts
ファイルにインポートします。ここでは、このようなスキーマにCUSTOM_ELEMENTS_SCHEMA
をインポートする必要があります。
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { MyComponent } from './my/my';
import { IonicPageModule } from 'ionic-angular';
@NgModule({
declarations: [MyComponent],
imports: [IonicPageModule.forChild(MyComponent)],
exports: [MyComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class ComponentsModule {}
行を削除しますimport { HomePage } from '../pages/home/home';
app.module.ts
ファイルから、代わりに次の行import { HomePageModule } from '../pages/home/home.module';
を追加します
これで、コンポーネントのセレクターをhome.html
ファイルのhtmlタグとして使用できます。
myComponent.tsがコンポーネントの場合。
次に、コマンドionic generate(遅延読み込みを使用しない場合)によって生成されたモジュールを削除し、app.module.tsに直接以下を追加できます。
@NgModule({
declarations: [
MyComponent,
]
entryComponents: [
MyComponent
] });
そしてmyComponent.tsは次のようになります:
@Component({
selector: 'app-sheduler',
templateUrl: 'sheduler.html'
})
export class ShedulerComponent {}
あなたは以下のようにそれをする必要があります:
import { ComponentsModule } from "../../components/components.module";
@NgModule({
declarations: [
OtherPage,
ComponentsModule,
],
imports: [
IonicPageModule.forChild(OtherPage),
],
entryComponents: [
ComponentsModule
]
})
export class OtherPageModule {}
モジュールで CUSTOM_ELEMENTS_SCHEMA 宣言を正常に使用した後、セレクターに「-」ダッシュで名前を付ける必要があるため、次のようなものを使用する必要があります。
<MyPlayer-comp></MyPlayer-comp>
それが機能し、ngcが「...既知の要素ではない...」について文句を言わなくなったにもかかわらず、私はこれらのフレームワークのキャメルケースフリークからのこのまったく無意味なことに腹を立てました。
私は個人的にpreferすべてを同じ名前にします(クラス、セレクター、ファイルなど...)
Web用にビルドしている間、遅延読み込みで動作している次の状態に戻りました。 (ionic cordova build browser --prod --release)
カスタムコンポーネントモジュールの宣言:
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
//
import { MyPlayerComp } from './MyPlayerComp ';
//
@NgModule({
declarations: [MyPlayerComp ],
imports: [IonicPageModule.forChild(MyPlayerComp )],
exports: [MyPlayerComp ],
})
export class MyPlayerCompModule { }
カスタムコンポーネントを使用するモジュールでは、以下を使用します。
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
//
import { PlyrView } from './PlyrView';
//
import { MyPlayerCompModule } from './MyPlayerComp.module' // 20180720
//
@NgModule({
declarations: [PlyrView],
imports: [
IonicPageModule.forChild(PlyrView),
MyPlayerCompModule, // <<<<<
],
exports: [PlyrView],
})
export class PlyrViewModule { }
これが誰かに役立つことを願っています
1つの方法は、各コンポーネントをapp.module.tsファイルに追加してから、次のように宣言することです。
import { MyComp } from "../../components/my-comp/my-comp";
@NgModule({
declarations: [
OtherPage,
MyComp
],
imports: [
IonicPageModule.forChild(OtherPage)
],
})
export class OtherPageModule {}