使用index.ts文件导出类会导致注入的构造函数

时间:2016-05-05 14:16:02

标签: javascript typescript angular angular2-services

我使用index.ts文件来封装出口,如角度2样式指南(https://github.com/mgechev/angular2-style-guide/blob/master/old/README.md#directory-structure)中所述。
这在我写的应用程序中运行良好,但出于某种原因,在一个服务中,我试图注入另一个服务,这会导致一个奇怪的错误。

导出的类:

import {Injectable} from "angular2/core";
@Injectable()
export class UserIds{
   private _signature_id:string;
   private _role_id:number;
   get signature_id():string{
      return this._signature_id;
   }
   set signature_id(id:string){
      this._signature_id = id;
   }
   get role_id():number{
      return this._role_id;
   }
   set role_id(id:number){
      this._role_id = id;
   }
}

index.ts文件:

export {Midiate} from "./midiate.service/midiate.service";
export {HttpRest} from "./http_rest.service/http_rest.service";
export {UserIds} from "./user_ids.service/user_ids.service"

导致错误的代码(导入文件):

import {UserIds} from "../index";
import {Http} from 'angular2/http';
@Injectable()
export class HttpRest{
 constructor(
    public _http: Http,
    public userIdsx: UserIds
 ){}
...
}

浏览器抛出的错误:

EXCEPTION: Cannot resolve all parameters for 'HttpRest'(Http, undefined). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'HttpRest' is decorated with Injectable.

正如您所看到的,UserIds类在构造函数的参数中未定义。

将UserIds导入更改为源文件解决了问题:

import {UserIds} from "../user_ids.service/user_ids.service";

我仍然希望使用index.ts作为我的应用程序中的所有其他服务和组件来保持旧样式,并且也理解为什么会发生这种情况。

2 个答案:

答案 0 :(得分:2)

在Minko Gechev的风格指南中,他按名称引用了该文件。我也遇到了这个问题,只是将我的立面文件移到一个文件夹中,然后按名称引用该文件。我还重命名了该文件夹,以避免名称与facade文件冲突,因为路径混淆,因为路径中没有文件扩展名

我遇到了this question,询问是否在文件夹中创建了一个index.ts文件,他们遇到了同样的问题。

| shared
    | services
        | login.service.ts
        | blog.service.ts

| shared
    | _services
        | login.service.ts
        | blog.service.ts
    | services.ts

services.ts包含

的位置
export {LoginService} from './_services/login.service'
export * from './_services/blog.service'

然后我使用以下导入

引用我的服务
import {LoginService, BlogService} from './shared/services'

答案 1 :(得分:2)

看起来你将输出放在index.ts中的顺序很重要!不确定它是否是一个错误但无论如何......

用元数据装饰的类应该在index.ts的顶部。如果其中一个注入另一个,那么"另一个"应该高于" one"。