2016-05-28 15 views
2

私のコードがデータを無限に要求している理由を理解できません。私のサービスでは、オブジェクトの配列であるデータを取得します。 Webページの残りの部分でその配列が必要なので、ローカル配列を含むサービスが必要なので、私はすべてのhttp、map、サービスを購読する必要があります。ブラウザで開発者ツールを使用すると、ブラウザがクラッシュするまでgetメソッドが無限に要求されます。HTTP GETが無限にデータを要求します

注目されるのは、着信データが「file.json」ではなくプレーンURLであることです。バックエンドでは、オブジェクトを持つ配列としてデータを送信するためにJacksonオブジェクトマッパーを使用します。

私は、http.get( 'someUrl')を送信してコンポーネントをマップしてサブスクライブするだけでサービスを提供するコードを変更すると、正常に動作します。私はまた、削除データメソッドでいくつかの助けを使用することができました、私はそれを変更しても、コンポーネントでマッピングとサブスクリプションを行うためにそれを動作させませんでした。

希望のエラーが表示されることを願っています。延々とそのループ

コード:

たMyService:

export class MyService { 

    private dummys: Array<Dummy>; 

    constructor(private http: Http) { 
     this.dummys = new Array<Dummy>(); 
    } 
    getData() { 
     this.http.get('someUrl') 
      .map((res: Response) => res.json()) 
      .subscribe(dummys => this.dummys = dummys); 
     return this.dummys; 
    } 

    saveData(dummy: Dummy) { 

     let body = JSON.stringify(dummy); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let options = new RequestOptions({ headers: headers }); 

     this.http.get('someUrl', body, options) 
      .map((res: Response) => res.json()) 
      .subscribe(dummy => this.dummys.push(dummy)); 
     return this.dummys; 
    } 

    deleteData() { 

     let index = this.dummys.indexOf(dummy); 

     let body = JSON.stringify(dummy); 
     let headers = new Headers({ 'Content-Type': 'application/json' }); 
     let options = new RequestOptions({ headers: headers }); 

     this.http.post('someUrl', body, options) 
      .map((res: Response) => res.json()) 
      .subscribe(dummy => this.dummys = this.dummys.splice(index, 1); 
     return this.dummys; 
    } 
} 

MyComponentの:MyComponentの中

export class MyComponent { 

    name: string; 
    id: string; 
    date: string; 
    dummys: Array<Dummy>; 

    constructor(public _myService: MyService, public _router: Router) { } 

    getDatas() { 
     this._myService.getData() 
    } 

    saveDatas() { 
     let dummy = new Dummy(this.id, this.name, this.date) 
     this._myService.saveData(dummy) 
     this.name = ''; 
     this._myService.getData(); 
    } 

    deleteDatas(dummy) { 
     this._myService.deleteData(dummy); 
     this._myService.getData(); 
    } 

} 

マイテンプレート:

<form (submit)="saveDatas()"> 
    <input required [(ngModel)]="name" placeholder="Add data"> 
</form> 
<br> 
<table> 
    <tr *ngFor="let data of getDatas()"> 
    <td>{{data.name}}</td> 
    <td> {{data.date}} </td> 
    <td><button (click)="removeDatas(data)">Remove</button></td> 
    </tr> 
</table> 
+0

応答コードはHTTPリクエストを返すどのようなものです:

export class MyService { ... getData() { return this.http.get('someUrl') .map((res: Response) => res.json()) } ... } export class MyComponent { ... ngOnInit() { this.getDatas(); } getDatas() { this._myService.getData().subscribe( response => { this.datas = response}); } ... } 

そして、あなたのテンプレートで

?それはリダイレクト応答(302)を返すかもしれない –

+0

実際には何もコードはありません、私はネットワーク活動を見ても何のステータスも表示されません...ちょうどgetmethod百万回....そしてそれはクラッシュします... – Alex

答えて

1

が観測を購読そしてMyComponentの中で、あなたのサービスで観察を返す:

<tr *ngFor="let data of datas"> 
+0

はい、これはうまくいきます。しかし、これは、ダミーデータがコンポーネント内のローカルの "ダミー"配列に "格納"されているという意味ではありません。なぜなら、私はそれをサービスのローカルダミーの配列に入れる必要があるからです。ユーザーがコンポーネントの「ダミー」をクリックすると、ユーザーが別のページに移動し、そのメソッドがサービス内にあるという機能があるためです。だから今私はエラーを "プロパティを読み取ることができません....のnull"、それは、サービス内のローカル配列がnullであることを私は推測する。私がばかだと申し訳ありませんが、httpにはまったく新しいです;) – Alex

+0

MyComponentのmyService属性にアクセスできます。そこに値を追加します。 – muetzerich

+0

さて、あなたがどういう意味か分かりません。つまり、サービス配列に値を追加しようとしていて、配列の現在の内容をコンポーネントに返すようにしていました。これは私の元々の質問につながります:get-requestはブラウザがクラッシュするまで繰り返されます... – Alex

関連する問題