2017-02-23 12 views
5

Próbowałem przełączyć moją aplikację na kompilację AoT i otrzymywałem ten błąd w środowisku produkcyjnym podczas ładowania aplikacji (działa dobrze lokalnie).Angular2 - Błąd: nie można rozwiązać wszystkich parametrów dla IconService

Error: Can't resolve all parameters for IconService: (?, ?)

wydaje się, że błąd pochodzi na modułach, które jest zapewnienie IconService. Konstruktor usługi ikony wygląda

constructor(private http:Http, private iconConfiguror:IconConfiguror) {

Więc moje pytanie brzmi: co oznacza ten błąd oznacza i dlaczego tak się stało w środowisku produkcyjnym tylko (Próbowałem umożliwiające tryb prod lokalnie)?

Wydaje się, oznacza to, że parametry konfiguracyjne HTTP i ikona nie są przewidziane, ale ikona config jest na poziomie modułu aplikacji i HttpModule jest importowany w IconModule gdzie IconService jest świadczona.

@NgModule({ 
    imports: [ 
     CommonModule, 
     HttpModule, 
    ], 
    declarations: [ 
     IconComponent, 
    ], 
    exports: [ 
     IconComponent, 
    ], 
    providers: [ 
     IconService, 
     __platform_browser_private__.BROWSER_SANITIZATION_PROVIDERS, 
    ], 
}) 

I lufa dla naszego składnika ikony.

+0

'Konstruktor (prywatny http: Http, ikona prywatna Konfigurator: IconConfiguror)' – Alex

+1

@ AJT_82 zapomniałem zaktualizować, również spróbowałem. – tallkid24

+0

"__dekorat" jest poprawny, nie należy go tam wprowadzać. W jaki sposób zapewniasz usługę 'IconConfiguror'? – altschuler

Odpowiedz

5

Naprawiono to, udostępniając IconService w inny sposób.

{ 
     provide: IconService, 
     useFactory: iconServiceFactory, 
     deps: [Http, IconConfiguror], 
    }, 

a sama fabryka

export function iconServiceFactory(http: Http, iconConfiguror: IconConfiguror) { 
    return new IconService(http, iconConfiguror); 
} 

Chyba z jakiegoś powodu HTTP nie był przewidziany (choć HttpModule został importowany), więc musiałem zadeklarować ją jako zależności.

2

Napotkałem podobny problem. Rozwiązałem go, zmieniając zamówienie eksportowe w beczce.

Podstawowe pliki serwisowe:

// dependency.service.ts 
@Injectable() 
export class DependencyService { } 

// dependant.service.ts 
import { DependencyService } from '.'; 

@Injectable() 
export class DependantService { 
    constructor(private dependency: DependencyService) { } 
} 

Obserwuje baryłkę powoduje błąd:

// index.ts 
export * from './dependant.service'; 
export * from './dependency.service'; 

Idąc jeden działa:

// index.ts 
export * from './dependency.service'; 
export * from './dependant.service'; 
+0

Po prostu doświadczyłem tego problemu i zastanawiam się, czy wiesz, dlaczego tak się dzieje? –

+0

@JacquesCornat Nie zbadałem tego. Przynajmniej znajduję logiczne, że kolejność zależności musi być poprawna. Podejrzewam jednak, jak procesory są przetwarzane. – LoganMzz

1

Czasami ma jednego sposobu, aby to naprawić - ręcznie opisać parametry.

static get parameters() { return [Http, IconConfiguror] } 

constructor(private http:Http, private iconConfiguror:IconConfiguror) { 
5

Możliwym powodem tego błędu jest, jeśli nie są dekorowanie klasy IconService z @Injectable(). Jeśli to jest powód, dodanie tej dekoracji powyżej deklaracji klasy naprawi błąd.

0

pracował dla mnie, kiedy stosowane następujące podczas importowania Usługę app.module.ts

{provide: AuthService, 
    depends: HttpClientModule} 
0

Mój problem było to, że dziedziczy z klasy bazowej, a ja urządzone tę klasę bazową z @Injectable . Klasa dziedzicząca była klasą, która powinna mieć atrybut @Injectable, a nie klasę podstawową. Wydaje się, że gdy kompilator widzi atrybut @Injectable, sprawdza, czy wszystkie właściwości w konstruktorze mogą zostać wstrzyknięte. Jeśli nie, to błąd.Rozwiązałem go, usuwając attibut @Injectable z tej klasy.

Powiązane problemy