web-dev-qa-db-de.com

Angular 2 kann nicht alle Parameter für den Dienst auflösen

Ich habe zwei Dienste: LoginService und UserService. Ich versuche, UserService in LoginService einzuschleusen, und die App wird nicht ausgeführt.

In der Konsole habe ich den Fehler:

Fehler: Es können nicht alle Parameter für UserService: ([Objekt Objekt],?) Aufgelöst werden. at SyntaxError.ZoneAwareError ( http: // localhost: 4200/polyfills.bundle.js: 7156: ) at SyntaxError.BaseError [als Konstruktor]

das ist mein LoginService:

import {UserService} from '../services/user.service';
@Injectable()
export class LoginService {

  constructor(public _http: Http,public us:UserService) {
  }

und UserService:

 @Injectable()
    export class UserService {
    constructor(private _http: Http , public _ls: LoginService) {

    }

Winkelmodul:

import {LoginService} from './services/login.service';
import {UserService} from './services/user.service';

@NgModule({
  declarations: [
    AppComponent,


  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,

  ],
  exports: [BrowserModule, SlimLoadingBarModule],
  providers: [UserService, LoginService, appRoutingProviders],
  bootstrap: [AppComponent]
})
export class AppModule { }

Sie haben einen Zirkelverweis.

Ihr UserService erfordert LoginService und LoginService erfordert UserService.

Entfernen Sie eine der Abhängigkeiten. Z.B. Richten Sie Ihren UserService neu ein, sodass kein Verweis auf LoginService erforderlich ist

29
Steve Land

Wie in den anderen Veröffentlichungen erwähnt, handelt es sich um eine zirkuläre Abhängigkeit. Sie können erwägen, dieses Problem mit forwardRef() zu beheben.

Kurz gesagt, wir können eine Vorwärtsreferenz anstelle des tatsächlichen Dienstes einfügen. Die Service-Injection wird also aufgeschoben. Damit ist die zirkuläre Abhängigkeit gelöst.

Hier ist ein Codebeispiel:

import {Component, Inject, forwardRef} from '@angular/core';

@Component({
  selector: 'my-app',
  template: '<h1>Favourite framework: {{ name }}</h1>'
})
class AppComponent {
  name: string;

  constructor(@Inject(forwardRef(() => NameService)) nameService) {
    this.name = nameService.getName();
  }
}

class NameService {
  getName () {
    return "Angular";
  }
}

Sie können diese Seite für weitere Details überprüfen.

3
Scott McMaster