Angular 2 angular-cli AOT在模块中声明抽象类?

时间:2017-01-16 20:10:19

标签: angular angular-cli

我试图使用angular-cli进行AOT编译设置。我有一个从抽象类继承的指令,并且我在编译期间得到一个错误,即angular无法确定抽象类属于哪个模块。我无法将其添加到NgModule的声明数组中,那么正确的方法是什么呢?我的代码结构如下所示,

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

在调试之后好了,如果我把它变成抽象并将其添加到声明中就可以了。这是否意味着我不能将一个类标记为抽象类?这看起来不对......

2 个答案:

答案 0 :(得分:8)

从抽象类中删除@Component装饰器,将其替换为@Injectable()装饰器。

答案 1 :(得分:0)

是的..确实,如果你创建一个抽象类并尝试将它用作指令控制器,它将无法正常工作,原因在于documentation

文档的重点部分如下enter image description here

当您创建指令时, Angular会创建指令控制器类的新实例。当您使用抽象类时,您不能拥有它的实例,因此它在您的情况下失败