2017-01-16 140 views
8

我正在嘗試使用angular-cli來獲得AOT編譯設置。我有一個從抽象類繼承的指令,並且在編譯期間出現錯誤,無法確定抽象類屬於哪個模塊。我不能將它添加到NgModule的聲明數組中,那麼有什麼正確的方法可以解決這個問題呢?我的代碼結構看起來像這樣,Angular 2 angular-cli AOT在模塊中聲明抽象類?

//...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:

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

好一些調試後,如果我做它不是抽象的,它添加到聲明它的作品。這是否意味着我不能將課程標記爲抽象?這似乎不正確的...

+0

爲您的模塊添加代碼app.module.ts – Aravind

+0

@Aravind ok。我無法將TutorialDirective添加到聲明數組中。只是讓你知道。 – Steveadoo

+0

好吧,如果我不把它抽象並將它添加到聲明它的工作。這是否意味着我不能將課程標記爲抽象?這似乎不正確... – Steveadoo

回答

0

是..這是真的,如果你創建一個抽象類,並嘗試使用它作爲指令的控制器,它不會工作的原因是在此間舉行的documentation

以下文檔的重點部分如下enter image description here

當您創建指令時,Angular將創建指令的控制器類的新實例。當你使用抽象類時,你不能擁有它的實例,因此它在你的情況下失敗

+4

我有一個實現類,它只是從實例角度的基類繼承而來創造,而不是抽象的。如果我使用JIT,但不是AOT,這一切都有效。我不確定就是這樣。 – Steveadoo

+1

同樣的問題在這裏,你有任何解決方法? – godzsa

2

從抽象類中刪除@Component裝飾器。

+0

這對我來說似乎是正確的解決方案。你不應該需要裝飾器,因爲每個實現抽象類的類都會有自己的裝飾器。一旦爲抽象類刪除了裝飾器,您就不需要將它放入ngModule聲明中,因爲它現在只是一個正常的打字稿導入。 – apricity

+0

我還必須添加@Injectable()來代替@Component才能正常工作 – apricity

+0

IMO此解決方案最有意義;因爲它是抽象的,所以它不能真正被認爲是什麼角度定義爲一個組件。 –