2017-07-18 70 views
2
getPersonalMast(name:string){ 
     console.log("patient"); 
      this.masterDataService.getPersonalMast(this.staff).subscribe(console.log("Inside subscribe"), response => this.staffInfo = response); 
      return this.staffInfo; 
    } 

這是主服務稱爲角通話服務兩次

getPersonalMast(personName: String): Observable<PersonalMastModel[]>{ 
console.log("patientInfo"); 
     let headers = new Headers();   
      if(personName!= undefined){ 
       headers.append(AppUtils.HEADER_AUTHENTICATION, localStorage.getItem(AppUtils.STORAGE_ACCOUNT_TOKEN)); 
       headers.append('Content-Type','application/json'); 
       headers.append('Access-Control-Allow-Origin', '*'); 
      return this.http.post(AppUtils.GET_PERSONAL_MASTER_URL ,{personName:personName},{headers:headers}) 

       .map(console.log("Inside map"),response => response.json().result) 
       .catch(this.handleError); 
      } 
    } 

有了這個服務,每次調用這個服務會導致多次擊中的URL。

每個方法調用=多重服務調用。

爲什麼出現這種情況,我該如何解決這個問題?

調用服務代碼:

<input ng2-auto-complete 
        [(ngModel)]="staff"     
        [source]="staffInfo" 
        placeholder="enter text" 
        [list-formatter]="listFormatter" 
        value-property-name="perscode" 
        display-property-name="personName" 
        (keypress)="getPersonalMast($event)" 
        > 
+1

您可以顯示調用服務的代碼? – DeborahK

+0

每次組件加載時服務調用的次數是2次,還是第一次調用服務時,第二次調用兩次時,第三次調用三次時等,當您重新加載窗口或重新訪問此組件時? –

+0

@DeborahK更新了問題 – user630209

回答

1

通常這種行爲是訂閱的可觀,而不是當你破壞了組件退訂的結果,因此預訂仍然存在,當再次部件載荷,可觀察的響應多倍到組件的請求。這些訂閱積累。

爲了防止這種情況,並防止內存泄漏,當你摧毀的每個組件,你應該退訂觀測。

這些進口添加到您的組件

import 'rxjs/add/operator/takeUntil'; 
import { Subject } from 'rxjs/Subject'; 

在你的類添加這個 - 我通常做這種構造之上。

private ngUnsubscribe: Subject<any> = new Subject<any>() 

添加ngOnDestroy功能

ngOnDestroy() { 
    this.ngUnsubscribe.next(); 
    this.ngUnsubscribe.complete(); 
    } 

然後你.subscribe

.takeUntil(this.ngUnsubscribe) 

所以你的情況,它看起來像在此之前立即添加此。

getPersonalMast(姓名:字符串){ console.log(「this.staff」+ JSON.stringify(this.staff));

this.masterDataService.getPersonalMast(this.staff) 
     .takeUntil(this.ngUnsubscribe) 
     .subscribe(response => this.staffInfo = response); 
     return this.staffInfo; 
} 

所以會發生什麼是訂閱將保持活動狀態,直到從組件導航離開,此時ngOnDestroy其從可觀察退訂乾淨火災。

編輯:根據您的HTML

的夾雜物。如果你在你的模板中的錯誤,例如未關閉標籤:

<div><div>而不是<div></div>

或者,如果默認類型(提交),你可能會看到此行爲按鈕提交您的形式離開了。

<button type="button" (click)="submitForm()"> 

相反的:

<button (click)="submitForm()"> or <button type="submit" (click)="submitForm()"> 
+0

實現所有你提到的,仍然調用兩次。 – user630209

+0

在if(personName!= undefined){...}塊中的服務中放置一個console.log語句,如「設置標題」,然後查看哪些標題消息和this.staff消息出現在控制檯上。 –

+0

我有一個主服務,它調用Web服務。另一種方法是從組件調用它,我稱之爲主服務。由於我給出的名字都相同,所以可能會感到困惑。因此,我在這裏提到了我已經添加到組件的內容。我需要在Master中添加這個嗎? – user630209