2017-02-12 3 views
4

私はangular2で新しく、解決策を見つけるのに多くの時間を割いたが、私はしなかった。私はクラスのhttp呼び出しストアからoberservableを変換したいと思います。angle2 observableをクラスに変換したい

私は、次があります。

JSONファイル

[{ 
    "nickname": "magicMike", 
    "id": "123", 
    "name": "Michael", 
    "nachname": "Fischer", 
    "pictURL": "../images/mainPanel/Image_dummy.jpg", 
    "city": "Ulm" 
}] 

ユーザクラスファイル:

export class User { 

    nickname: string; 
    id: string; 
    name: string; 
    nachname: string; 
    pictURL: string; 
    city: string; 


    constructor(
    nickname: string, 
    id: string, 
    name: string, 
    nachname: string, 
    pictURL: string, 
    city: string 
){ 
    this.nickname = nickname; 
    this.id = id; 
    this.name = name; 
    this.nachname = nachname; 
    this.pictURL = pictURL; 
    this.city = city; 
    } 
} 

JSONファイルを読み込んサービス

import { Component, Input } from '@angular/core'; 
import { Injectable }  from '@angular/core'; 
import { Http, Response, Headers, RequestOptions } from '@angular/http'; 
import {Observable} from 'rxjs/Rx'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/operator/catch'; 
import { User } from './user' 

@Injectable() 
export class UserService { 
    user: Array<User>; 
    private useUrl = '/json/user.json'; 
    constructor(private http: Http) { 

    } 



    getUser(): Observable<any> { 
    return this.http.get(this.useUrl) 
     .map(this.extractData) 
     .do(data => console.log("User from json: " + JSON.stringify(data))) 
     .catch(this.handleError); 
    } 

    private extractData(response: Response) { 
    let body = response.json(); 
    return body || {}; 
    } 


    private handleError(error: Response) { 
    console.log(error); 
    return Observable.throw(error.json().error || "500 internal server error"); 
    } 

そして、コンポーネントそれはoberservableをとり、配列に格納します。

....... 
export class AppComponent implements OnInit { 


     public user: User[]; 

    ngOnInit() { 
     this.userService.getUser() 
      .map((user: Array<any>) => { 
      let result:Array<User> = []; 
      if (user) { 
       user.forEach((erg) => { 
       result.push(new User(erg.nickname, erg.id, erg.name, erg.nachname, erg.pictURL, erg.city)); 
       }); 
       } 

      }) 
      .subscribe(user => this.user = user); 
     } 
.... 

私はこれを実行すると次のエラーが発生します。

C:/Users/Lenovo/Documents/ui-challenger.one/src/app/app.component.ts (53,26): Type 'void' is not assignable to type 'User[]'.) 

私は誰もそこに助けてくれることを願っています。私はちょうど私がこの「User.name」あなたは手動でオブジェクトにJSON解析する必要がいけない

答えて

1
ngOnInit() { 
    this.userService.getUser() 
     .map((user: Array<any>) => { 
     let result:Array<User> = []; 
     if (user) { 
      user.forEach((erg) => { 
      result.push(new User(erg.nickname, erg.id, erg.name, erg.nachname, erg.pictURL, erg.city)); 
      }); 
     } 
     return result; // <<<=== missing return 
     }) 
     .subscribe(user => this.user = user); 
    } 
+0

ありがとう!この助け!もう1つの質問。私は今、例{{user.name}}を使用してテンプレート上でユーザーを使用できると思っても動作しません。私は混乱しています!?申し訳ありませんが、私はタイトスクリプトで新しいです。 –

+0

「user」がまだ 'null'(データがサーバから到着するまで)の間にエラーを避けるには' {{user?.name}} 'が必要です。 –

+0

{{user?.name}}を使用していればもう一度お返事ありがとうございます:-)私はローカルファイルを読み込んでいるので驚いていました。また、ngOnInitはrederingの前にあります..... hmmm大丈夫です。助けてくれてありがとう。 –

0

のような性質を読むことができるクラスにJSONファイルの解析します。あなたは以下のようなことをする -

getUser(): Observable<User[]> { 
    return this.http.get(this.useUrl) 
     .map(data => <User[]>data); 
    } 
+0

クラスにメソッドやgetter/setterがある場合は動作しませんが、結果のインスタンスにはこれらがありません。 –

+0

@GünterZöchbauer私はjsonをgetters/settersでtypescriptオブジェクトにキャストすることができたと思います。私はそれをチェックします。 – Yousuf

+0

いいえ、キャストは静的コード解析を満たすだけですが、実行時にはこれはまったく効果がありません。値は普通のJSONのままです。 –

関連する問題