如果在具有元注释的组件之后定义类,则该类不可注入

时间:2016-01-17 13:22:38

标签: javascript dependency-injection ecmascript-6 angular

我刚开始使用Angular2快速启动项目。有一个简单的应用程序。我添加了DataService类,因此代码会分离出来。

最初,我在应用程序的主要组件DataService之后添加了MyAppComponent类,如下所示。

import {Component, View} from 'angular2/core';
import {NgFor} from 'angular2/common';
import {bootstrap} from 'angular2/platform/browser';

@Component({
    'selector': 'my-app',
    template: `<div *ngFor="#item of items">{{item}}</div>`,
    directives: [NgFor],
    providers: [DataService] //taking service as injectable
})
export class MyAppComponent {
    items: Array<number>;
    constructor(service: DataService) {
        this.items = service.getItems(); //retrieving list to bind on the UI.
    }
}
//created service, but its after the component which has meta annotation
export class DataService {
    items: Array<number>;
    constructor() {
        this.items = [1, 2, 3, 4];
    }
    getItems() {
        return this.items; //return the items list
    }
}

bootstrap(MyAppComponent)

上面的代码编译正确,但在运行时它会抛出错误。

  

EXCEPTION:无法解析所有参数   MyAppComponent(不确定)。确保它们都有有效的类型或   注释

使用代码2小时后,我将DataService移到了MyAppComponent上方。我很高兴这个问题得到了解决。

但是我非常好奇地知道,如果我在DataService之后class加上MetaAnnotation,那么为什么它不起作用?

修改

我尝试了@GünterZöchbauer提供的解决方案,如下所示,

import {Component, View, Inject, forwardRef} from 'angular2/core';
import {NgFor} from 'angular2/common';
import {bootstrap} from 'angular2/platform/browser';

@Component({
    'selector': 'my-app',
    template: `<div *ngFor="#item of items">{{item}}</div>`,
    directives: [NgFor],
    providers: [DataService] //tried commenting this still throws error.
})
export class MyAppComponent {
    items: Array<number>;
    constructor(@Inject(forwardRef(() => DataService)) service: DataService) {
        this.items = service.getItems();
    }
}

但在控制台中仍然出现错误。看起来好像

  

EXCEPTION:TypeError:无法读取未定义的属性'toString'

1 个答案:

答案 0 :(得分:4)

JavaScript并没有提升课程。使用forwardRef,将3 333333333333333333333333333333333..... you get the idea. 移至其自己的文件,或将DataService类移到DataService上方

MyAppComponent

另见
- Angular 2 error:
- http://blog.thoughtram.io/angular/2015/09/03/forward-references-in-angular-2.html