角度2 v2.0.1では、onInitが2回呼び出されます。 (もちろん、私も一度呼ばれていたときにも、何か間違ったことをやっているが、それは今の問題ではありません)角度2 httpが2回呼び出されて観測可能になる
はここに私のPlunkerです:http://plnkr.co/edit/SqAiY3j7ZDlFc8q3I212?p=preview
ここではサービスコードです:
import {Injectable} from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
@Injectable()
export class DemoService {
constructor(private http:Http) { }
// Uses http.get() to load a single JSON file
getData() {
return this.http.get('./src/data.json')
.map((res:Response) => res.json())
.do(data => console.log(data))
.subscribe(data => {
return <PageContent[]>data;
}, error => console.log("there was an error!"));
}
}
export class PageContent {
constructor(public _id: string,
public tag: string,
public title: string,
public body?:string,
public image?: string) {}
}
は...それを使用する単純なコンポーネントです。
//our root app component
import {Component, NgModule, OnInit } from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
import { DemoService, PageContent } from './service';
import { HttpModule } from '@angular/http';
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello {{name}}</h2>
</div>
<div *ngFor="let page of pages">
{{ page.title }}
</div>
`
})
export class App implements OnInit {
name:string;
pages: PageContent[] = [];
constructor(private _service: DemoService) {
this.name = 'Angular2'
this.loadData(); // <-- this is called once
}
ngOnInit() {
//this.loadData(); // <-- this is called twice
}
loadData(){
this.pages = this._service.getData();
console.log(this.pages);
}
}
@NgModule({
imports: [ BrowserModule, HttpModule ],
declarations: [ App ],
providers: [DemoService],
bootstrap: [ App ]
})
export class AppModule {}
免責事項:それはアウトerroringですが、あなたはそれがサービスメソッドがコンストラクタから呼び出されているときに一度提供されていますが、それはngOnInitフックの内側だとき、それが二回呼び出さ見ることができます。
私の質問は、なぜOnInit関数から2回呼び出されているのですか?
UPDATE:すべての答えから解決策:
これは、新しいサービスメソッドです:
getData() {
return this.http.get('./src/data.json')
.map((res:Response) => res.json() as PageContent[]);
}
...と、これは新しいコンポーネントのメソッドです:
loadData(){
this._service.getData()
.subscribe(data => this.pages = data);
}
削除テンプレートの一部がngForを使用してアプリケーションを失敗させ、通常の状況では1度だけ呼び出されることがわかります。 –
@JBNizet - しかし、データを表示するには* ngForが必要です。 –