2016-06-07 98 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。