2017-01-16 7 views
8

私はangle-cliでAOTコンパイルセットアップをしようとしています。抽象クラスを継承するディレクティブがあります。コンパイル時に、抽象クラスがどのモジュールに属しているかを角度で判断できないエラーが発生しています。私はそれをNgModuleの宣言配列に追加することはできないので、これについて正しい方法は何でしょうか?私はそれが抽象的ではないにし、それを追加した場合、いくつかのデバッグ後に[OK]を角2角形AOTは、モジュール内の抽象クラスを宣言していますか?

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 { TutorialService } from './tutorial/tutorial.service'; 
import { TutorialDirective, DefaultTutorialDirective } from './tutorial/directive/tutorial.directive'; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    DefaultTutorialDirective 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: [TutorialService], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

:私のコードの構造は次のようになり、

//...imports 
export abstract class TutorialDirective { 
    //...base class logic 
} 

@Directive({ 
    selector: '[tut]', 
    exportAs: 'tut' 
}) 
export class DefaultTutorialDirective extends TutorialDirective { 
    //...calls into the base class for some shared stuff. 
} 

エラーがこの

ERROR in Cannot determine the module for class TutorialDirective in /test-app/src/app/tutorial/directive/tutorial.directive.ts! 

マイAppModuleのように見えます宣言は動作します。これは、クラスを抽象クラスとしてマークすることができないということですか?それは...ないと思える

+0

モジュールのコードを追加します。app.module.ts – Aravind

+0

@Aravind ok。宣言配列にTutorialDirectiveを追加することはできません。ちょうどあなたに知らせる。 – Steveadoo

+0

私はそれを抽象化せず宣言に加えるとうまくいきます。これは、クラスを抽象クラスとしてマークすることができないということですか?それは正しいとは思わない... – Steveadoo

答えて

0
はい...あなたが抽象クラスを作成し、指令コントローラとしてそれを使用してみた場合、それは理由が動作しませんというのは本当です

documentation

にここにあります以下のようなドキュメントのハイライト部分enter image description here

角は、ディレクティブのコントローラクラスの新しいインスタンスを作成します。抽象クラスを使用する場合、インスタンスを持つことはできません。したがって、あなたのケースでは失敗します。

+4

私はインスタンスクラスである基底クラスから継承する実装クラスを持っています抽象的なものではなく、作成します。これは、JITを使用してもAOTではなくすべて使用できます。それだけは分かりません。 – Steveadoo

+1

同じ問題が発生しましたが、回避策はありますか? – godzsa

2

抽象クラスから@Componentデコレータを削除します。

+0

これは私にとって正しい解決策のようです。抽象クラスを実装する各クラスは独自のデコレータを持つため、デコレータは必要ありません。デコレータが抽象クラス用に削除されると、この時点で通常のタイプコピーのインポートだけであるため、ngModule宣言にデコレータを配置する必要はありません。 – apricity

+0

この作業を行うために@Comjectの代わりに@Injectable()を追加する必要がありました。 – apricity

+0

IMOこのソリューションが最も理にかなっています。それは抽象的なものなので、どの角度がコンポーネントとして定義されているかは実際には考えられません。 –

関連する問題