首页 文章

Angular2从子对象接下来调用观察者

提问于
浏览
1

我会尽力解释这个问题 .

我有一个服务,包含一个可观察的类,执行任务来更新自己 . 需要使用位于服务中的观察者将该可观察类推送到应用程序 . 如何在不创建某种依赖循环的情况下从子进程中调用该观察者?

这是一个粗略的例子:

class MyService {
  subClass$: Observable<SubClass>;
  _subClassObserver: Observer<SubClass>;

  constructor(private _subClassStore: SubClass){
    this.subClass$ = new Observable(observer => {
      this._subClassObserver = observer
    }).share();
  }

  pushData(){
    this._subClassObserver.next(this._subClassStore)
  }
}

class SubClass {
  displayData: string;
  displayData2: number;

  constructor(){
    socket.on('setData', function(obj){
      this.displayData = obj.dd1;
      this.displayData2 = obj.dd2;
      //How to call pushData() in MyService from here to push data to app?
    }
  }
}

_subClassStore正在通过来自socket.io的流进行更新 . 当SubClass数据发生变化时,如何让MyService知道,以便它可以使用_subClassObserver.next(_subClassStore)推送它?

EDIT: 我在上面的例子中添加了更多细节,以显示它们的相关和利用方式 .

SubClass只是来自socket.io的数据流的监听器,并将信息保存到类中 . 它在构建MyService时开始监听 .

MyService的目标是提供一堆可以在整个应用程序中订阅的子类 . 每个都允许访问不同的数据流和相关数据,但所有数据流都包含在一个服务中 .

问题是如何在父代中调用pushData()函数,以便为应用程序中的订阅者保持流更新 .

Edit 2:

这可能有所帮助 . 下面是如何在没有子类的情况下将其编写为服务 . 我没有这样做的唯一原因是因为有大量的这些监听器被存储到Observables并将它们抽象到类中使得信息更容易管理但是将它推送到应用程序是我无法想象的出:

class MyService {
  class1$: Observable<DataStream>;
  _class1Observer: Observer<DataStream>;
  _class1Store: DataStream;

  constructor(){
    this._class1store = {displayData: 'hello', displayData2: 0};

    this.class1$ = new Observable(observer => {
      this._class1Observer = observer
    }).share();

    socket.on('setData', function(obj){
      this._class1Store.displayData = obj.dd1;
      this._class1Store.displayData2 = obj.dd2;
      this._class1Observer.next(this._class1Store)
    }
  }

interface DataStream = {
   displayData: string;
   displayData2: number;
}

1 回答

  • 1

    而不是 function(obj) 使用 ()=> 否则 this 将不会ponit到 MyService 实例 .

    constructor(){
        socket.on('setData', (obj) =>{
          this.displayData = obj.dd1;
          this.displayData2 = obj.dd2;
          //How to call pushData() in MyService from here to push data to app?
        }
      }
    

    我不确定,但我认为 socket 很容易在Angulars区外跑 . 也试试

    constructor(zone:NgZone){
        socket.on('setData', (obj) =>{
          zone.run(() => {
            this.displayData = obj.dd1;
            this.displayData2 = obj.dd2;
          //How to call pushData() in MyService from here to push data to app?
          });
        }
      }
    

    为了能够从 SubClass 调用 MyService 中的方法, SubClass 需要对 MyService 的引用

    class MyService {
      subClass$: Observable<SubClass>;
      _subClassObserver: Observer<SubClass>;
    
      constructor(private _subClassStore: SubClass){
        _subClassStore.myService = this;
        this.subClass$ = new Observable(observer => {
          this._subClassObserver = observer
        }).share();
      }
    
      pushData(){
        this._subClassObserver.next(this._subClassStore)
      }
    }
    
    class SubClass {
      displayData: string;
      displayData2: number;
      myService:MyService;
    
      constructor(zone:NgZone){
        socket.on('setData', (obj) =>{
          zone.run(() => {
            this.displayData = obj.dd1;
            this.displayData2 = obj.dd2;
            this.myService.pushData();
          });
        }
      }
    }
    

相关问题