2017-03-29 14 views
3

次のエラーに直面し、解決方法を理解できません。AuthenticationServiceのすべてのパラメータを解決できません:([オブジェクトオブジェクト]、?、[オブジェクトオブジェクト])

AuthenticationServiceのすべてのパラメータを解決できません:(?、[オブジェクトのオブジェクト]、[オブジェクトのオブジェクト]を)

私はここにほぼすべてのトピックをチェックしましたし、それを解決する複数の方法を試してみましたそれでもまだ2日目にそれを打つことはできません。

私はこのようなappServiceで最初のAuthServiceを注入しようとしたが、同じエラーに

@Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService 

を取得し、私はすべてのDIおよびサービスの内部輸入の順序をチェックして、すべてがそう

正しいように思えます誰かが私にそれに対処するのを手伝ってもらえると感謝しています。

アンギュラ4.0.0

のAuthService

import { Injectable } from '@angular/core'; 
import {Http, Headers, Response} from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 
import {Observable} from 'rxjs/Rx'; 

import {AppServices} from "../../app.services"; 
import {Router} from "@angular/router"; 

@Injectable() 
export class AuthenticationService { 
    public token: any; 

    constructor(
    private http: Http, 
    private appService: AppServices, 
    private router: Router 
) { 
    this.token = localStorage.getItem('token'); 
    } 

    login(username: string, password: string): Observable<boolean> { 
    let headers = new Headers(); 
    let body = null; 
    headers.append("Authorization",("Basic " + btoa(username + ':' + password))); 

    return this.http.post(this.appService.api + '/login', body, {headers: headers}) 
     .map((response: Response) => { 
     let token = response.json() && response.json().token; 
     if (token) { 
      this.token = token; 
      localStorage.setItem('Conform_token', token); 
      return true; 
     } else { 
      return false; 
     } 
     }); 
    } 

    logout(): void { 
    this.token = null; 
    localStorage.removeItem('Conform_token'); 
    this.router.navigate(['/login']); 
    } 
} 

アプリケーションサービス

import {Injectable} from '@angular/core'; 
import {Headers, Http, RequestOptions} from '@angular/http'; 
import {Router} from "@angular/router"; 
import {AuthenticationService} from "./auth/auth.service"; 

import 'rxjs/add/operator/toPromise'; 
import {Observable} from 'rxjs/Rx'; 

@Injectable() 

export class AppServices { 

    api = '//endpoint/'; 

    public options: any; 
    constructor(
    private http: Http, 
    private router: Router, 
    public authService: AuthenticationService // doesn't work 
    // @Inject(forwardRef(() => AuthenticationService)) public authService: AuthenticationService // doesn't work either 
    ) { 
     let head = new Headers({ 
     'Authorization': 'Bearer ' + this.authService.token, 
     "Content-Type": "application/json; charset=utf8" 
    }); 
    this.options = new RequestOptions({headers: head}); 
    } 

    // ==================== 
    // data services 
    // ==================== 

    getData(): Promise<any> { 
    return this.http 
     .get(this.api + "/data", this.options) 
     .toPromise() 
     .then(response => response.json() as Array<Object>) 
     .catch((err)=>{this.handleError(err);}) 
    } 

アプリケーションモジュールあなたはAppServices間の循環依存を持つ

import { BrowserModule } from '@angular/platform-browser'; 
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 

import { NgModule } from '@angular/core'; 
import { FormsModule } from '@angular/forms'; 
import {BaseRequestOptions, HttpModule} from '@angular/http'; 

import { MaterialModule} from '@angular/material'; 
import {FlexLayoutModule} from "@angular/flex-layout"; 
import 'hammerjs'; 

import { routing, appRoutingProviders } from './app.routing'; 
import { AppServices } from './app.services'; 
import {AuthGuard} from "./auth/auth.guard"; 
import {AuthenticationService} from "./auth/auth.service"; 

import {AppComponent} from './app.component'; 
import {AuthComponent} from './auth/auth.component'; 
import {NotFoundComponent} from './404/not-found.component'; 
import { HomeComponent } from './home/home.component'; 

@NgModule({ 
    declarations: [ 
    AppComponent, 
    AuthComponent, 
    NotFoundComponent, 
    HomeComponent 
    ], 
    imports: [ 
    BrowserModule, 
    BrowserAnimationsModule, 
    FormsModule, 
    HttpModule, 
    routing, 
    MaterialModule, 
    FlexLayoutModule 
    ], 
    providers: [AppServices, AuthGuard, AuthenticationService], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

答えて

7

d AuthenticationService - これはAngularのようなコンストラクタインジェクションでは不可能です。あなたは

export class AuthenticationService { 
    public token: any; 
    appService: AppServices; 
    constructor(
    private http: Http, 
    // private appService: AppServices, 
    injector:Injector; 
    private router: Router 
) { 
    setTimeout(() => this.appService = injector.get(AppServices)); 
    this.token = localStorage.getItem('token'); 
    } 

あなたがAppServiceのコンストラクタ(またはその逆)からAuthenticationService.appServiceをも設定することができsetTimeoutを避けるためにもDI with cyclic dependency with custom HTTP and ConfigService

を参照してください

+2

がためにあなたに感謝し使用することができます回避するに

ソリューションと説明。私はそれをたくさんいただきありがとうございます – antonyboom

関連する問題