2016-05-25 62 views
1

我會盡我所能地解釋這一點。Angular2接下來從子對象中調用觀察者

我有一個服務,它包含一個可執行任務以更新自身的可觀察類。該可觀察類需要使用位於服務中的觀察者推送到應用程序。我怎樣才能從小孩那裏調用這個觀察者而不創建某種依賴性循環?

這裏是一個粗略的例子:

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進來流更新。如何讓MyService知道SubClass數據何時更改,以便可以使用_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; 
} 
+0

我猜你需要提供有關這些組件是如何相關的更多上下文的引用。 –

+0

我提供了一些信息。這可能有點太複雜,沒有一個實質性的代碼示例來解釋,所以如果它仍然沒有任何意義,只要讓我知道,我會刪除它,以防止混淆他人。 – BrentShanahan

回答

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很容易跑到安格拉斯區外。 嘗試也

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從​​,​​需要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(); 
     }); 
    } 
    } 
} 
+0

MyService是否引用SubClass和SubClass引用MyService而不會創建無限循環?或者它只是提供對類的引用而不是類的實例。意味着一個循環只有在彼此之間將一個變量賦值給另一個變量時纔會被創建。例如:父級創建一個創建父級實例的子實例,重複。 – BrentShanahan

+0

以這種方式創建循環不會導致任何問題。例如,如果DI必須解決不支持的循環(當MyService在構造函數參數中需要SubClass並且SubClass在構造函數參數中需要MyService時將不起作用),會導致問題。 –

+0

真棒,感謝您的信息! – BrentShanahan