代码之家  ›  专栏  ›  技术社区  ›  james watt

在页面/组件中共享来自服务的相同可观察信息

  •  0
  • james watt  · 技术社区  · 8 年前

    我想订同样的 Observable 好几次都没用。我有一个提供者给我 可观察的 AngularFirestore 对象。这是我的提供者:

    @Injectable()
    export class MyProvider {
      private myObservable: Observable<any>;
      constructor(private aFs: AngularFirestore) {
        //retriving some data and putting in myObservable
      }
    
      getObservable() {
        return this.myObservable;
      }
    }
    

    在我的 myPage.ts 我愿意:

    this.mySubscription = this.myProvider.getObservable().subscribe(value => {
      //something that works
    });
    

    在另一个组件中,我也这样做,但它没有给我任何东西。我如何分享 可观察的 是服务商还是服务商?我试过 unsubscribe() 当我从页面弹出到组件时,当我调用 取消订阅() 在组件上,然后导航到我的页面, subscribe() 不起作用。

    取消订阅() 在我的页面中,我会:

    ionViewWillLeave() {
      this.mySubscription.unsubscribe();
    }
    

    取消订阅() 在我的组件中,在导航到我的页面之前,我会:

    myEvent() {
      this.mySubscription.unsubscribe();
      this.navCtrl.push(MyPage);
    }
    

    当我从我的页面弹出 取消订阅() 似乎工作正常,因为我能看到 myObservable 我组件中的数据。当我试图从组件导航到 MyPage 这个 取消订阅() 好像没用,因为我什么也看不见。我也试过调试,但看不到 订阅() 在第二种情况下。

    我将提供者导入 app.module.ts 在下面 providers 然后我把它导入我的页面:

    MyPaG.TS

    import { MyProvider } from ..;
    

    构造函数(mypage.ts):

    constructor(private myProvider: MyProvider) {..}
    

    在我的组件中:

    支原体

    从..;导入{myprovider};
    

    构造函数(home.ts)

    构造函数(私有myprovider:myprovider){..}
    

    我澄清一下 MyComponent 不用于 小精灵 !我把它用在 Home 然后我用它来推动 小精灵 . 我这么做是因为我想在 肌力成分 然后我想推动 小精灵 包含数据详细信息的。

    很容易,我想在组件和页面上共享从服务获取的相同可见结果,并且我想 订阅() 两者兼而有之。这可能吗?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Vikas RyanSand20    8 年前

    如果您的目标是多播数据,请使用rxjs Subject BehaviorSubject
    主体 充当源之间的桥梁/代理 Observable 和许多 observers ,使多个 观察员 分享同样的东西 可观察的 执行。
    这种推荐的暴露受试者的方法是使用 asObservable() 操作员。

    @Injectable()
    export class MyProvider {
      private myObservable=new Subject<any>();
      CurrentData = this.myObservable.asObservable();
      constructor(private aFs: AngularFirestore) {
        //your logic
          this.myObservable.next(value);//push data into observable
      }
    
    
    }
    

    佩格斯

    this.mySubscription = this.myProvider.CurrentData.subscribe(value => {
          //something that works
        });
    

    使用行为主体

     @Injectable()
        export class MyProvider {
          private myObservable=new BehaviorSubject<any>('');
          CurrentData = this.myObservable.asObservable();
          constructor(private aFs: AngularFirestore) {
    
          }
    
         getData(myParam): void { 
           someasynccall.pipe(map(),filter()).
              subscribe(value=>this.myObservable.next(value))
    
    
        }
    

    佩格斯

    this.myProvider.getData(param);
    this.mySubscription = this.myProvider.CurrentData.subscribe(value => {
          //something that works
        });
    

    Subject vs BehaviorSubject

    LiveDemo