Angular-cli(ng new my-project-name
)を使用して新しいプロジェクトを作成しました
npm run test
を実行すると、エラーなく実行されます。
フォントアイコンを表示するために、プロジェクトにfont-awsomeモジュール( https://www.npmjs.com/package/angular-font-awesome )を追加しました。
Htmlファイルに<fa name="bars"></fa>
タグを追加し、期待どおりに出力しました。 npm run test
を再度実行すると、3つの失敗で終了し、それらはすべてfa
タグを対象としています。
失敗レポートのサンプルはこちら
'fa' is not a known element:
1. If 'fa' 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. ("--The content below is only a placeholder and can be replaced.-->
<div style="text-align:center"> [ERROR ->]<fa name="bars"></fa>
<h1> Welcome to {{title}}!
"): ng:///DynamicTestModule/AppComponent.html@2:2 Error: Template parse errors:
at syntaxError home/harsha/Documents/Projects/testProject/node_modules/@angular/compiler/esm5/compiler.js:466:22)
NO_ERRORS_SCHEMA
ファイルにCUSTOM_ELEMENTS_SCHEMA
、app.module.ts
を追加するなど、いくつかの修正を試みました。
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AngularFontAwesomeModule
],
providers: [],
bootstrap: [AppComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA,
NO_ERRORS_SCHEMA
]
})`
しかし、何もうまくいきませんでした。
テスト仕様ファイルでは、次のように設定する必要があります。
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ yourcomponent ],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
TestBed.configureTestingModuleメソッドのschemasプロパティに注目してください。スキーマプロパティを設定した後、Font Awsomeコンポーネントを追加する前と同様に、テストをエラーなしで実行する必要があります。
this post で説明されているプロジェクトに動的コンポーネントアプローチを開発しているときに同じエラーが発生しました。私の場合、DynamicComponent
を介してsvgタグを渡すことでエラーが生成されました。このコンポーネントのNO_ERRORS_SCHEMA
に@NgModule
を追加すると役に立ちました。
import { Component, OnChanges, OnInit, Input, NgModule, NgModuleFactory, Compiler, SimpleChanges, NO_ERRORS_SCHEMA } from '@angular/core';
import { SharedModule } from '../../../../../../../../shared.module';
@Component({
selector: 'dynamic',
template: `<ng-container *ngComponentOutlet="dynamicComponent; ngModuleFactory: dynamicModule;"></ng-container>`
})
export class DynamicComponent {
dynamicComponent: any;
dynamicModule: NgModuleFactory<any>;
@Input('html') html: string;
constructor(private compiler: Compiler) {}
ngOnChanges(changes: SimpleChanges) {
if (changes['html'] && !changes['html'].isFirstChange()) {
this.dynamicComponent = this.createNewComponent(this.html);
this.dynamicModule = this.compiler.compileModuleSync(this.createComponentModule(this.dynamicComponent));
}
}
ngOnInit() {
this.dynamicComponent = this.createNewComponent(this.html);
this.dynamicModule = this.compiler.compileModuleSync(this.createComponentModule(this.dynamicComponent));
}
protected createComponentModule(componentType: any) {
@NgModule({
imports: [SharedModule],
declarations: [componentType],
entryComponents: [componentType],
schemas: [NO_ERRORS_SCHEMA]
})
class RuntimeComponentModule {}
// a module for just this Type
return RuntimeComponentModule;
}
protected createNewComponent(template: string) {
@Component({
selector: 'dynamic-component',
template: template ? template : '<div></div>'
})
class MyDynamicComponent {
//metods passed via dynamic component to svg
testMe() {
alert('test passed!');
}
}
return MyDynamicComponent;
}
}
この問題を解決して、SampleComponent(sample.ts)というカスタムコンポーネントを作成しました。これは、welcome.htmlで使用し、ionicプロジェクトのすべてのカスタムコンポーネントの共通モジュールファイルの下にありますcomponents .module.tsこれは次のようになります。
import { NgModule,NO_ERRORS_SCHEMA,CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { SampleComponent } from './sample/sample';
@NgModule({
declarations: [SampleComponent],
imports: [],
exports: [SampleComponent],
schemas: [
CUSTOM_ELEMENTS_SCHEMA,
NO_ERRORS_SCHEMA
]
})
export class ComponentsModule {}
welcome.module.ts使用したい場所sample.component.tsインポートしたcomponents.module.ts次のようになります
import { NgModule } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { IonicPageModule } from 'ionic-angular';
import { WelcomePage } from './welcome';
import { ComponentsModule } from "../../components/components.module";
@NgModule({
declarations: [
WelcomePage,
],
imports: [
IonicPageModule.forChild(WelcomePage),
TranslateModule.forChild(),
ComponentsModule
],
exports: [
WelcomePage
]
})
export class WelcomePageModule { }
welcome.htmlカスタムコンポーネント(SampleComponent)を使用した場所
<ion-content scroll="false">
<div class="splash-bg"></div>
<div class="splash-info">
<div class="splash-logo"></div>
<div class="splash-intro">
{{ 'WELCOME_INTRO' | translate }}
</div>
</div>
<div padding>
<p>`enter code here`
<sample>loading...</sample>
</p>
<button ion-button block (click)="signup()">{{ 'SIGNUP' | translate }}</button>
<button ion-button block (click)="login()" class="login">{{ 'LOGIN' | translate }}</button>
</div>
</ion-content>
参考までに、このNgModuleプロパティを機能モジュールに追加する場合は、ルートNgModuleにも追加する必要があります。または少なくとも私はしなければなりませんでした。