私はAngular2を試しており、チュートリアルに従っています。Angular2 - OnInit:Serviceのsubscribe関数から返された値がComponentフィールドに割り当てられません。
私は現在、JSONサーバからデータを取得するサービスがあります。私の問題は、サブスクライブ関数から返されたデータはないが、ある
:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { User } from './user';
@Injectable()
export class UserService {
constructor(private http: Http) {}
private usersUrl = 'http://localhost:3000/users';
getUsers(): Observable<User[]> {
return this.http.get(this.usersUrl) //the request won't go out until something subscribes to the observable
.map(this.extractData)
.catch(this.handleError); // pass an error message back to the component for presentation to the user but only if we can say something the user can understand and act upon
}
private extractData(response: Response) {
if (response.status < 200 || response.status >= 300) {
throw new Error('Bad response status: ' + response.status);
}
let body = response.json(); // parse JSON string into JavaScript objects
return body.data || { };
}
private handleError (error: any) {
// In a real world app, we might send the error to remote logging infrastructure before returning/sending the error
let errMsg = error.message || 'Server error'; // transform the error into a user-friendly message
return Observable.throw(errMsg); // returns the message in a new, failed observable
}
}
そして、私のコンポーネントをgetUsers()の呼び出しが完了した後、Componentプロパティ 'users'に渡されます。私はuserService()。getUsersメソッド内でデータを記録できるので、サービスメソッド呼び出しからデータがコンポーネントに返されることはわかります。私が最初にgetUsersを呼び出すが、奇妙なことは、私のngOnInit上にconsole.logの呼び出しは、最初に私のgetUsersメソッド内console.logs前に私のdevのコンソールに印刷されている:
ngOnInit() {
this.getUsers();
console.log('ngOnit after getUsers() ' + this.users);
}
Devのコンソールのスクリーンショット:
これを試してみていただきありがとうございます。ngOnInitコンソールログの呼び出し内に値が表示されますが、テンプレートのユーザープロパティを参照すると、未定義の値が取得されます。サービス取得メソッド呼び出しから返されたオブザーバブルに暗黙的にサブスクライブする代わりに非同期機能を使用することは有効です。私はまだAngularのチュートリアルでうまくいけば、上記がうまくいかない理由は分かりません。 –
エラーは、Angularが 'ngOnInit()'の前に値をバインドしようとしているために発生します。 '{{users.xxx}} 'の代わりに' {{users?.xxx}} 'を使用してエラーを取得しないでください。 –
それは私の問題を修正しました。ありがとう! –