从桶(https://angular.io/docs/ts/latest/glossary.html#!#barrel)导入服务时,我遇到了依赖注入问题。
我遇到的问题是:
使用Angular指南,在应用程序中有一个核心桶,然后是每个文件夹的桶,这些是通过在每个文件夹中包含一个index.ts来实现的。核心index.ts引用每个文件夹中的所有内容,然后每个文件夹引用特定文件。
核心index.ts
...
export * from './test/index';
测试index.ts
...
export * from './my-service.service';
代码
import { MyService } from '../../core';
...
@Injectable()
export class AuthGuard implements CanActivate {
isValidSession: boolean = false;
errorMessage: any;
constructor(
private myService: MyService
) { }
canActivate(
// Not using but worth knowing about
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) {
return this.myService.doSomething();
}
}
上述代码导致以下错误:
Uncaught Cannot resolve all parameters for 'AuthGuard'(undefined). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'AuthGuard' is decorated with Injectable.
查看代码时,我发现缺少@Injectable
注释没有任何问题。事实上,相同的服务正在其他组件中使用,并使用核心index.ts。
article我发现建议应该使用构造函数中的@Inject
,因为有时当TypeScript转换为JavaScript时,不会创建元数据。在我的案例中,这并没有解决问题。在尝试了几件事之后,我只是尝试更改导入以获得如下所示的服务,并且没有抛出错误。
成功导入:
import { MyService } from '../../core/test/my-service.service';
或
import { MyService } from '../../core/test';
我不确定我的应用程序中的index.ts文件中是否存在问题,或者文件结构本身是错误的,但从我可以看到它们正常工作。想知道为什么这个import
正在发挥作用。
答案 0 :(得分:7)
我有完全相同的问题且Günter是正确的:桶中export
s的顺序似乎很重要。
在我的情况下,我在我的桶里:
export * from 'my.component'
export * from 'my.service'
导致了您看到的相同错误。 将服务放在之前使用它的组件解决了问题:
export * from 'my.service'
export * from 'my.component'
我没有找到关于此的任何文档,但我发现这种行为肯定不太理想,因为
答案 1 :(得分:1)
订单确实如上所述!不确定这是不是一个错误,但无论如何......
因此,在我看来,用元数据装饰的类应该位于index.ts的顶部 如果其中一个注入另一个,则“另一个”应该高于“一个”。