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

时间:2016-05-25 18:28:25

标签: javascript typescript angular

我会尽力解释这个问题。

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

这是一个粗略的例子:

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)推送它?

修改 我在上面的例子中添加了更多细节,以显示它们是如何相关和利用的。

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

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

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

编辑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 个答案:

答案 0 :(得分:1)

而不是function(obj)使用()=>,否则this将不会向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?
      });
    }
  }

为了能够从MyService调用SubClass中的方法,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();
      });
    }
  }
}