2016-06-07 93 views
0

我在角2 ShareService工作兩次或,角2訂閱shareService幾次

******************************shareService************************* 
import { BehaviorSubject , Subject} from 'rxjs/Rx'; 
import { Injectable } from '@angular/core'; 


@Injectable() 
export class shareService { 


    isLogin$:BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false); 
    CheckUser = this.isLogin$.asObservable(); 
    public isLogin (bool){ 
     this.isLogin$.next(bool); 
    } 
} 

及其我的另一組件和subscibeCheckUser;

***********************another Component******************************* 

     _shareService.CheckUser.subscribe((val) =>{ 
      *********all of this scope execute for several times just i have one another component and one next function******* 
      this.isLogin = val; 
      alert(val); 
      if(this.isLogin){ 

       console.log("req req req"); 
       this.MyBasket(); 

      } 
      else if(this.ext.CheckLocalStorage("ShopItems")){ 

        this.ShopItems = JSON.parse(localStorage.getItem("ShopItems")); 
        setTimeout(() => { 
         _shareService.sendShopItems(this.ShopItems); 
        },100); 

      } 

     }); 

我的問題是我執行一次this.isLogin$.next(bool)但訂閱功能執行兩次或多次!!!!我的籃子功能是一個xhr請求,這意味着當用戶在我得到多個請求到服務器!!!我無法修復它...我不知道這個問題是爲角2或沒有,任何人都有這個問題? 過去幾天我參與了這個問題!

+0

相同在http://stackoverflow.com/questions/37654458/shareservice-in-angular-2-twice-subscribe-the-next-function。請提供一個Plunker來複制。 –

回答

0

問題是您的shareService正在獲取多個實例。

其中一個解決方案是強制服務成爲單身人士。

像這樣的東西應該工作:即需要在你現有的構造

import { provide, Injectable } from '@angular/core'; 

@Injectable() 
export class shareService { 
    private static instance: shareService = null; 

    // Return the instance of the service 
    public static getInstance(/*Constructor args*/): shareService { 
    if (shareService.instance === null) { 
     shareService.instance = new shareService(/*Constructor args*/); 
    } 
    return shareService.instance; 
    } 

    constructor(/*Constructor args*/) {} 
} 

export const SHARE_SERVICE_PROVIDER = [ 
    provide(shareService, { 
    deps: [/*Constructor args dependencies*/], 
    useFactory: (/*Constructor args*/): shareService => { 
     return shareService.getInstance(/*Constructor args*/); 
    } 
    }) 
]; 

一切都應該放在哪裏,它說constructor args

現在對你的組件,你使用這樣的服務:

@Component({ 
    providers: [SHARE_SERVICE_PROVIDER] 
}) 

然後你可以像通常那樣稱呼它。

另一種解決方案是將當前服務注入到應用程序的主要組件中。有關更多信息,請參見here

+0

我從「./shareService」導入導入{SHARE_SERVICE_PROVIDER};但是當調用_shareService。 CheckUser.subscribe,我得到錯誤檢查用戶沒有定義!plz幫助我如何使用它 –

+0

你添加了'構造函數(_shareService:sh​​areService)'嗎? –

+0

絕對是... 我有一個shopService,並從shareService提供數據...我的shopService是injectable()和導入到3組件...我測試它與'構造函數(){alert()} ',警告函數3次執行...和我的 '_shareService.CheckUser.subscribe()'函數太3次執行...這意味着我的構造函數執行導入自己的服務的數量...如何解決它? ?我只需要一次執行:( –

0

的問題是,該服務是單身主義者和組件在該點的

_shareService.CheckUser.subscribe 

訂閱它,它創建或每次(我沒有看到完整的代碼)被放置,所以CheckUser應是一個返回Observable的方法。如果你有朋友,我可以編輯它。 另一個語義問題是observable應該以$結束而不是BehaviorSubject。