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;
}
あなたは私の一日を保存しました。ありがとうございました。 – Einsamer
ようこそ。 DIは、依存関係(コンストラクタパラメータ)を持つコンポーネントからプロバイダを検索し、一致するプロバイダが見つかるまでその親で処理を続けます。 DIはプロバイダごとに1つのインスタンスを維持します。プロバイダを '@NgModule()'に追加すると、それらはルートインジェクタに追加され、アプリケーション全体と共有されます。 –
アプリケーションにサブツリーを追加することによって、サブツリーのプロバイダーを定義することもできます。ルートインジェクタを使用する小規模なアプリケーションでは通常安全ですが、大規模なアプリケーションやより具体的なユースケースでは、プロバイダをコンポーネントに追加することでより細かい制御が必要になる場合があります。 –