javascript - Å bruke index.ts-fil for å eksportere klasse forårsaker undefined i injisert konstruktør


Jeg bruker en index.ts-fil for å kapsle inn eksporter som nevnt i Angular 2-stilguiden (https://github.com/mgechev/angular2-style-guide/blob/master/old/README.md#directory-structure).
Dette fungerte fint i hele appen jeg skriver, men av en eller annen grunn i en tjeneste som jeg prøver å injisere i en annen tjeneste, forårsaker dette en merkelig feil.

Den eksporterte klassen:

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;
   }
}

Filene 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"

Koden som forårsaket feilen (importfilen):

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

Feilen som ble kastet av nettleseren:

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.

Som du kan se er UserIds-klassen udefinert i parametrene til konstruktøren.

Å endre importen av UserIds til kildefilen løste problemet:

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

Likevel vil jeg beholde den eldre stilen på dette ved å bruke index.ts som alle andre tjenester og komponenter i appen min, og også forstå hvorfor dette skjedde.

Svar #1

Det ser ut til at rekkefølgen du plasserer eksportene dine i index.ts faktisk har betydning! Ikke sikker på om det er en feil eller ikke, men uansett...

Klasser dekorert med metadata bør være øverst i index.ts. Hvis en av dem injiserer en annen, bør "den andre" være over "den ene".

Svar #2

I Minko Gechevs stilguide refererer han til filen med navn. Jeg støtte også på dette problemet og flyttet ganske enkelt fasadefilen min opp en mappe og refererte deretter til den filen med navn. Jeg ga også mappen nytt navn for å unngå en navnekonflikt med fasadefilen fordi stiene ble forvirret siden det ikke er noen filtype i stien.

Jeg kom over dette spørsmålet som handler om å lage en index.ts-fil i mappen, og de har det samme problemet som du har.

Fra

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

Til

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

Hvor services.ts inneholder

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

Jeg refererer deretter til tjenestene mine med følgende import

import {LoginService, BlogService} from './shared/services'

Relaterte artikler