Angular 2 - 依赖注入和打包

9
我在从一个中导入服务时遇到了依赖注入的问题。
我面对的问题是这样的:
按照Angular的指南,在应用程序中有一个核心桶,然后每个文件夹都有一个桶,这是通过在每个文件夹中拥有一个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 导入的。
我找到了一篇 文章,建议在构造函数中使用 @Inject,因为有时候当 TypeScript 转换成 JavaScript 时,元数据并未被创建。但这在我的情况下没有解决这个问题。尝试了几种方法后,我只是尝试了改变导入方式来获取服务,如下所示,错误就没有被抛出。
成功的导入:
import { MyService } from '../../core/test/my-service.service';

或者

import { MyService } from '../../core/test';

我不确定我的应用程序中的index.ts文件是否存在问题,或者文件结构本身是否错误,但从我所看到的情况来看,它们运行良好。想知道为什么这个特定的import会产生差异。


更改导入语句为常规导入语句后,它是否起作用了? - Maximilian Riegler
是的,我会把它添加到问题中。没有意识到它不够清晰! :) - Daniel Grima
我认为提到过桶中导出的顺序可能会引起问题。 - Günter Zöchbauer
可能有点奇怪,因为在应用组件中我正在引用/core来获取这个特定的服务,而且它很好。这就是让我感到困惑的地方。 - Daniel Grima
core/... 中是否有导入 AuthGuard 的内容? - André Werlang
2个回答

7
我曾经遇到过完全相同的问题,而Günter说得对:桶中export的顺序似乎很重要。
在我的情况下,我在桶中有:
export * from 'my.component'
export * from 'my.service'

这导致了与你看到的相同的错误。 将使用该服务的组件放在服务之前解决了问题:
export * from 'my.service'
export * from 'my.component'

我没有找到任何关于这个的文档,但我认为这种行为绝对不理想,因为

  • 它是隐式的
  • 没有记录
  • 错误信息并没有给你任何修复提示

谢谢您的回答。老实说,我没有深入研究过这个问题。但是我一定会尝试玩弄导出的顺序,看看是否解决了这个问题。之后会让您知道 :) - Daniel Grima
哦,我的天啊...我一整天都在追踪这个修复问题。谢谢! - Jonny Asmar

1

如上所述,顺序很重要!不确定是否存在错误,但无论如何...

因此,我认为用元数据修饰的类应该放在index.ts文件的顶部。如果其中一个注入另一个,则“另一个”应该在“一个”之上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接