角度2 - 依赖注入和桶化

时间:2016-06-30 08:29:15

标签: dependency-injection angular

从桶(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正在发挥作用。

2 个答案:

答案 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的顶部 如果其中一个注入另一个,则“另一个”应该高于“一个”。