2016-06-04 9 views
2

Zunächst einmal weiß ich, dass diese Antwort schon viele Male gepostet wurde, aber ich kann meine Arbeit nicht machen und vielleicht kann jemand hier helfen.Einzelinstanz eines Dienstes in Angular 2

Ich benutze angular-cli beta 5, um ein neues Projekt zu generieren. Ich benutze Winkel 2 rc1.

Ich habe eine Klasse mit der Bezeichnung ApplicationConfiguration < - diese ich möchte eine Instanz, durch jede Komponente meiner Anwendung.

In meinem main.ts ich habe:

bootstrap(MyProjWebAppComponent, [ROUTER_PROVIDERS, HTTP_PROVIDERS, ApplicationConfiguration, provide(Http, { 
    useFactory: (xhrBackend: XHRBackend, requestOptions: RequestOptions, router: Router, appConfig: ApplicationConfiguration) => new HttpServiceLayer(xhrBackend, requestOptions, router, appConfig), 
    deps: [XHRBackend, RequestOptions, Router, ApplicationConfiguration] 
})]); 

Meine ApplicationConfiguration Klasse:

@Injectable() 
export class ApplicationConfiguration { 

    constructor() { 
    console.log('aaa'); 
    } 
} 

Und ein Beispiel Bestandteil, wie ich meine ApplicationConfiguration injizieren:

import { ApplicationConfiguration } from '../..//services/application-configuration/application-configuration'; 
@Component({ 
    moduleId: module.id, 
    selector: 'app-log-in', 
    templateUrl: 'log-in.component.html', 
    styleUrls: ['log-in.component.css'], 
    directives: [ROUTER_DIRECTIVES], 
    providers: [ApplicationConfiguration, LogInService] 
}) 
export class LogInComponent implements OnInit { 

constructor(private _service: LogInService, private appConfig: ApplicationConfiguration, private _router: Router) { } 
} 

ich tun Ich weiß nicht, was ich falsch mache, aber jedes Mal, wenn ich zu einer neuen Seite navigiere und ich meine Klasse spritze, kann ich sehen Hat eine neue Instanz erstellt

Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen.

Eine Lösung für dieses Problem wird sehr geschätzt.

Antwort

6

Sie sollten die Klasse nicht mehrmals angeben, wenn Sie nur eine Instanz wünschen. Angular DI verwaltet eine Instanz pro Provider.

entfernen Deshalb ApplicationConfiguration von LogInComponent zu

providers: [LogInService] 

Ich sehe nicht, warum eine Fabrik würde für Ihre individuellen HttpServiceLayer notwendig sein. Dies sollte das gleiche tun:

Update (> = RC.5)

@NgModule({ 
    declarations: [MyProjWebAppComponent], 
    bootstrap: [MyProjWebAppComponent], 
    imports: [BrowserModule, RouterModule, HttpModule], 
    providers: [ 
    ApplicationConfiguration, 
    {provide Http: useClass: HttpServiceLayer}) 
    ] 
}); 

original Bootstrap (MyProjWebAppComponent, [ ROUTER_PROVIDERS, HTTP_PROVIDERS, ApplicationConfiguration, liefern (Http, {useClass: HttpServiceLayer}) ]);

+0

Hallo nochmal Günter Zöchbauer :). Natürlich habe ich Ihre Lösung versucht, das ist die Lösung, die ich überall im Internet sehe, das Problem ist, wenn ich ApplicationConfiguration von LogIns Provider entferne, bekomme ich den Fehler: 'EXCEPTION: Fehler: Uncaught (in Versprechung): AUSNAHME: Fehler in: 0: 0 ORIGINAL EXCEPTION: Kein Provider für ApplicationConfiguration! ' Außerdem können wir ausschließen, dass mein Bootstrap-in falsch ist, ich benutze das, das Sie zur Verfügung gestellt haben, und ich bekomme immer noch den gleichen Fehler – Mihai

+2

Ich denke nicht, dass das Ändern der Anbieter hier hilft. Der Fehler wird durch etwas anderes verursacht. Wahrscheinlich stimmt etwas nicht mit den Importen. Dieser ein "../..// services/..." sieht ein bisschen komisch aus ('//'). Können Sie das bitte noch einmal überprüfen? –

+0

Ihre Dienste haben alle den '@Injectable()' Dekorator? –