我刚开始使用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'
答案 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