2016-05-25 3 views
1

Я попытаюсь объяснить это как можно лучше.Angular2 call observer next from child object

У меня есть служба, которая содержит наблюдаемый класс, который выполняет задачи для обновления самого себя. Этот наблюдаемый класс нужно выталкивать в приложение, используя наблюдателя, расположенного в службе. Как я могу назвать этого наблюдателя от ребенка, не создавая какой-то цикл зависимостей?

Вот грубый пример:

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)?

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; 
} 
+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 из 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(); 
     }); 
    } 
    } 
} 
+0

Помогает ли MyService ссылаться на SubClass и SubClass, ссылаясь на MyService, не создавать бесконечный цикл? Или это просто указание ссылки на класс, а не экземпляр класса. Значение цикла будет создаваться только в том случае, если они связывают друг с другом переменную внутри друг друга?Пример: родитель, создающий дочерний экземпляр, который создает родительский экземпляр, повторяется. – BrentShanahan

+0

Создание цикла таким образом не вызывает никаких проблем. Это вызовет проблемы, например, если DI должен был разрешить цикл, который не поддерживается (когда 'MyService' требует' SubClass' в параметрах конструктора, а 'SubClass' требует, чтобы' MyService' в параметрах конструктора не работал). –

+0

Awesome, спасибо за информацию! – BrentShanahan