2017-10-06 91 views
1

無限循環我有這個代碼無限循環: 模板:與存儲和HTTP與ngFor

<ng-container *ngFor="let row of service.dataLoadAsync() | async"> 

服務:

dataLoadAsync(filters: FinishedCallsFilter = {}): Observable<FinishedCall[]> { 
    return this.httpFinishedCallsObservable(Object.assign({limit: this.limit}, {})).flatMap(response => { 
     this.store.dispatch(new ReplaceMany(response.items)) 
     return this.store 
    }) 
} 

我也試過這個功能的實現:

dataLoadAsync(filters: FinishedCallsFilter = {}): Observable<FinishedCall[]> { 
    this.httpFinishedCallsObservable(Object.assign({limit: this.limit}, {})) 
     .subscribe(response => this.store.dispatch(new ReplaceMany(response.items))) 
    return this.store 
} 

private httpFinishedCallsObservable(params: { limit: number, tag ?: string }) { 
    return this.http.post(this.apiUrl, params) 
     .map((json) => this.parseHttp(json)) 
     .do(response => this.tagStore.dispatch(new UpdateTag(response.tag))) 
} 

所以,這個問題。沒有http請求,evferything是好的。但後來我嘗試下載數據並更新存儲,在循環中函數調用了很多次。 如何修復代碼?我想使用存儲緩存

回答

3

它實際上不是一個無限循環。

如果您在模板中綁定一個函數,則每次運行角度更改檢測時都會調用該函數。

這是一般的不好的做法。相反,將結果分配給一個字段並綁定到該字段。

constructor() { 
    this.data = service.dataLoadAsync(); 
} 

<ng-container *ngFor="let row of service.data | async"> 
+0

謝謝!這工作! – x1site

+0

很高興聽到:) –

+1

即使使用ChangeDetectionStrategy.OnPush(認爲這會阻止?),並將函數綁定到返回'pluck'ed'http.get'響應的模板,也會有同樣的問題。訂閱http響應並將其分配給屬性似乎可行。 – Manolis