サービス内のhttpリクエストからの応答の構造化と処理に関する質問があります。私はが(ちょうど...私は愛するそれをOUT-テストを開始Psの...それに取り組んとgithubのを経由して貢献してきたすべての人々をありがとう)Angular2.alpha46活字体を使用していますAngular2ハンドリングhttp応答
だから次のことを行ってください。
ログイン-form.component.ts
import {Component, CORE_DIRECTIVES, FORM_DIRECTIVES} from 'angular2/angular2';
import {UserService} from '../../shared/service/user.service';
import {Router} from 'angular2/router';
import {User} from '../../model/user.model';
import {APP_ROUTES, Routes} from '../../core/route.config';
@Component({
selector: 'login-form',
templateUrl: 'app/login/components/login-form.component.html',
directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
})
export class LoginFormComponent {
user: User;
submitted: Boolean = false;
constructor(private userService:UserService, private router: Router) {
this.user = new User();
}
onLogin() {
this.submitted = true;
this.userService.login(this.user,
() => this.router.navigate([Routes.home.as]))
}
}
、このコンポーネントからの私は、サービスは次のようになり、ユーザーのログインを私のhttpリクエストを収容する私のUserServiceのインポート:
をuser.service.ts
import {Inject} from 'angular2/angular2';
import {Http, HTTP_BINDINGS, Headers} from 'angular2/http';
import {ROUTER_BINDINGS} from 'angular2/router';
import {User} from '../../model/user.model';
export class UserService {
private headers: Headers;
constructor(@Inject(Http) private http:Http) {
}
login(user: User, done: Function) {
var postData = "email=" + user.email + "&password=" + user.password;
this.headers = new Headers();
this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post('/auth/local', postData, {
headers: this.headers
})
.map((res:any) => res.json())
.subscribe(
data => this.saveJwt(data.id_token),
err => this.logError(err),
() => done()
);
}
saveJwt(jwt: string) {
if(jwt) localStorage.setItem('id_token', jwt)
}
logError(err: any) {
console.log(err);
}
}
は、私は何をしたい呼び出しが戻るhttpリクエストの後に応答を処理できるようにすることです。たとえば、ユーザーの資格情報が無効な場合は、バックエンドから401応答を戻します。私の質問は、応答を処理し、結果をコンポーネントを呼び出すコンポーネントに戻すための最良の方法です。成功メッセージを表示するか、エラーメッセージを表示するためにビューを操作できます。
現時点ではログイン中の私は現在応答を処理していません。元のコンポーネントにコールバックしていますが、これは正しい方法ではないと感じていますか?この典型的なシナリオで誰かが何をするかについて、誰かに光を当てることはできますか?
login(user: User, done: Function) {
var postData = "email=" + user.email + "&password=" + user.password;
this.headers = new Headers();
this.headers.append('Content-Type', 'application/x-www-form-urlencoded');
this.http.post('/auth/local', postData, {
headers: this.headers
})
.map((res:any) => res.json())
.subscribe(
(data) => {
// Handle response here
let responseStat = this.handleResponse(data.header)
// Do some stuff
this.saveJwt(data.id_token);
// do call back to original component and pass the response status
done(responseStat);
},
err => this.logError(err)
);
}
handleResponse(header) {
if(header.status != 401) {
return 'success'
}
return 'error blah blah'
}
、この場合には戻って細かいコールはありますか、これは、観察や約束をよりよく処理することができます。私のようなサブスクライブ関数の最初のパラメータで応答を処理しませんか?
私が求めていますどのような結論が戻っログインにHTTPレスポンスからの応答を処理し、user.service.tsからフォームのビューで状況を処理するためのベストプラクティスは何です... -form.component.ts
次のリリースで(参照[これはコミット(https://github.com/robwormald/angular/commit/cf338e8ec7cc8cfbe6e66eae51e271ee825c891f))非HTTPステータスコードを取得すると、 'Http'エラーが発生します。今のところ、 'map()'で応答を処理し、そこのステータスをチェックしてErrorを投げたり、値を渡したりすることができます。 –
迅速な返信Ericに感謝します。クール!私はそれを考えていましたが、いくつかのことがまだ議論の対象になっていることを認識しています...だから確かめるために...マップの応答ステータスを今のところ処理し、あなたはそれをより良いやり方でやり直すことができますか? – Nige
あなたはコールバックを一切必要としません、私の答えを見てください。それはうまくいけばあなたの質問に答えるでしょう:D –