3

ログインフォームを作成したい場合、ログインに成功すると、ルートコンポーネントがデータを受信して​​表示します。私はログインサービスを作成し、ルートコンポーネントはsubscribe()メソッドで通知を受け取ることができましたが、うまくいかないようです。ここ は私のコードです:サービスオブザーバブルフェール経由でコンポーネント間で通信する

//app.component.ts 
import { Component } from '@angular/core'; 
import { Router } from '@angular/router'; 

import { HttpConstant } from './constants/http.response'; 
import { LoginService } from './services/login.service'; 

@Component({ 
    moduleId: module.id, 
    selector: 'app', 
    templateUrl: 'app.component.html', 
    providers: [LoginService] 
}) 

export class AppComponent { 
    currentUser = 'Anonymous'; 

    constructor(private loginService: LoginService) { 
     console.log(loginService); 
     loginService.logInAnnouncement$.subscribe(email => { 
      console.log(email); 
      this.currentUser = email; 
     }); 
    } 
} 
//login.service.ts 
import { Injectable } from '@angular/core'; 
import { Headers, Http, Response } from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 
import { Observable } from 'rxjs'; 
import { Subject } from 'rxjs/Subject'; 

import { Profile } from '../entities/profile'; 
import { GuardService } from './guard.service'; 

@Injectable() 
export class LoginService { 

    private headers = new Headers(); 
    private loginUrl = 'api/v1/auth/login'; 
    private email = new Subject<string>(); 

    /** 
    * Observable string streams 
    */ 
    logInAnnouncement$ = this.email.asObservable(); 

    constructor(private http: Http, private guard: GuardService) { 
    } 

    login(email, password): Observable<any> { 
     this.headers.append('Content-Type', 'application/json'); 
     this.headers.append('Accept', 'application/json'); 
     return this.http 
      .post(this.loginUrl, JSON.stringify({email: email, password: password}), {headers: this.headers}) 
      .map((res:Response) => res.json()); 
    } 

    announceLogIn(email: string) { 
     this.email.next(email); 
     this.logInAnnouncement$.subscribe(email=>{ 
      console.log(email); 
     }); 
     console.log('OK'); 
    } 
} 
//login.component.ts 
import { Component, OnInit } from '@angular/core'; 
import { Router } from '@angular/router'; 

import { LoginService } from '../services/login.service'; 
import { Profile } from '../entities/profile'; 
import { HttpConstant } from '../constants/http.response'; 


@Component({ 
    moduleId: module.id, 
    selector: 'fix-login', 
    templateUrl: 'login.component.html', 
    providers: [LoginService, HttpConstant], 
}) 

export class LoginComponent implements OnInit { 

    profile: Profile; 
    validatingHandler: ValidateError; 
    // profile: Profile; 

    constructor(private loginService: LoginService, 
       private router: Router) { 
     this.profile = new Profile(); 
     this.validatingHandler = new ValidateError(); 
    } 

    ngOnInit(): void { 

    } 

    doLogin(event): void { 
     event.preventDefault(); 
     this.loginService.login(this.profile.email, this.profile.password) 
      .subscribe((data: Object) => { 
       if (data.status == 0) { 
        this.loginService.announceLogIn(this.profile.email); 
        this.router.navigate(['/']); 
       } 
      }, err => { 

       if (err.status == HttpConstant.HTTP_INVALID_INPUT) { 
        this.validatingError(err.json()); 
       } 
      }) 

    } 

    private validatingError(error): void { 
     this.validatingHandler = new ValidateError(); 
     this.validatingHandler._email = error.email; 
     this.validatingHandler._password = error.password; 
    } 


} 

class ValidateError { 
    _email: string; 
    _password: string; 
} 

答えて

2

すべてのコンポーネントのprovidersLoginServiceを追加しないでください。このようにして、すべてのコンポーネントは独自のインスタンスを注入します。

代わりに@NgModule()のプロバイダに追加すると、すべてのコンポーネントで同じインスタンスが注入されます。

+0

あなたは私の一日を保存しました。ありがとうございました。 – Einsamer

+0

ようこそ。 DIは、依存関係(コンストラクタパラメータ)を持つコンポーネントからプロバイダを検索し、一致するプロバイダが見つかるまでその親で処理を続けます。 DIはプロバイダごとに1つのインスタンスを維持します。プロバイダを '@NgModule()'に追加すると、それらはルートインジェクタに追加され、アプリケーション全体と共有されます。 –

+0

アプリケーションにサブツリーを追加することによって、サブツリーのプロバイダーを定義することもできます。ルートインジェクタを使用する小規模なアプリケーションでは通常安全ですが、大規模なアプリケーションやより具体的なユースケースでは、プロバイダをコンポーネントに追加することでより細かい制御が必要になる場合があります。 –

関連する問題