2016-07-28 13 views
0

Ich bin zu Service zu binden, die ohne Import in Komponente sichtbar wäre.Problem mit global sichtbaren Service in Angular 2

Meine Bootstrap-Funktion:

export function main(initialHmrState?: any): Promise<any> { 
    console.log(APP_PROVIDERS); 
    return bootstrap(App, [ 
    ...PLATFORM_PROVIDERS, 
    ...ENV_PROVIDERS, 
    ...APP_PROVIDERS 
    ]) 
    .then(decorateComponentRef) 
    .catch(err => console.error(err)); 
} 

App-Anbieter Definition:

export * from './app.component'; 
export * from './user.state'; 
export * from './app.service'; 

import { UserState } from './user.state'; 
import { AppState } from './app.service'; 

// Application wide providers 
export const APP_PROVIDERS = [ 
    UserState, 
    AppState 
]; 

und ich kann es nicht

constructor(private userState: UserState) {} 

in Komponenten Konstruktor aufrufen, wie ich mein Problem beheben kann?

Antwort

1

entweder durch Import oder durch einen String-Token oder OpaqueToken und `@Inject mit()

export const APP_PROVIDERS = [ 
    {provide: 'UserState', useClass: UserState}, 
    AppState 
]; 
constructor(@Inject('UserState') private userState: any) {} 
+0

Ich habe Fehler in der Konsole, wenn Ich benutze es in meiner Komponente: /home/maksym/untill/trunk/unTill.Modern/Code/App/src/app/backoffice/backoffice.component.ts:13:53 Kann den Namen 'UserState' nicht finden. –

+0

Tut mir leid, ich habe 'UserState' durch' any' an der falschen Stelle ersetzt. Ich habe meine Antwort aktualisiert. Sie müssen noch "UserState" importieren, wo Sie es bereitstellen. –

1

Es gibt zwei Teile:

  • Definition der Anbieter Namen Typen
  • Verwenden der Typen für die Injektion

In beiden Fällen müssen Sie entsprechende Typen importieren. Andernfalls werden sie nicht aufgelöst ...

Beachten Sie, dass die Verwendung von Typen für die Abhängigkeitsinjektion nicht zwingend erforderlich ist. Sie könnten schließlich OpaqueToken s verwenden:

export const SOME_TOKEN = new OpaqueToken('sometoken'); 
let provider = { provide: token, useClass: UserState }; 

und verwenden es:

constructor(@Inject(SOME_TOKEN) private userState: UserState) {} 

Aber in diesem Fall müssen Sie auch die undurchsichtige Token importieren ...