2017-02-16 15 views
3

Я использую другой модуль, поэтому его можно использовать в ленивых загружаемых модулях. вот мой файл службы.Я хочу использовать rxjs для обнаружения изменения значения в нескольких компонентах. Но он показывает только изменения в компоненте, который меняет его.

import {NgModule, Injectable } from '@angular/core' 
 
import {Subject} from 'rxjs/Subject'; 
 

 
@Injectable() 
 
export class ChangeEventService { 
 

 
    public invokeEvent:Subject<any> = new Subject(); 
 
    // localId:any = { name:'', eventId:0, orgId:0}; 
 
    constructor() { 
 
     
 
    } 
 

 
    public callComponent(currentId:any):void { 
 
     console.log("Invoked"); 
 
     this.invokeEvent.next({localId:currentId}); 
 
    } 
 
} 
 

 
@NgModule({ 
 
    imports: [ ], 
 
    exports : [ 
 
    ], 
 
    providers: [ ChangeEventService ], 
 
}) 
 
export class ChangeEventModule { }

Подписка на тему Rxjs только изменения в компоненте/сервиса, который изменяет его.

export class xyz { 
 
    constructor(private change: ChangeEventService) { 
 
        this.change.invokeEvent.subscribe((value) => { 
 
         this.event = value.localId; 
 
         console.log("I'm chnaged...!!"); 
 
        }); 
 
    } 
 

 
    
 
    anyFunction(eventdata:any) { 
 
      this.change.callComponent(eventdata); 
 
    } 
 
}

Я получаю обновленное значение только в компоненте, изменяющие значение InvokeEvent.

+0

Можете ли вы проверить, как часто выполняется конструктор. У вас может быть несколько экземпляров «ChangeEventService». – Philipp

+1

является 'this.change.invokeEvent.callComponent (данныеСобытия);' предполагают, чтобы быть 'this.change.callComponent (данныеСобытия);' – shusson

+0

@shusson: +1. Кроме того, вы уверены, что «ChangeEventService» является синглом? Объявлено ли это в «NgModule.providers» модуля, который ** загружен ** (vs lazily-load)? – AngularChef

ответ

1

Как @Philipp заметил я создавал несколько экземпляров моей службы путем предоставления его в нескольких модулей. И, как было предложено @AngularFrance, я объявил в нем провайдера app.module (1-й модуль моего приложения). чем я не получал обновленную стоимость в любой подписке (кроме той, которая вызывала callComponent) в первый раз. Поэтому я использовал BehaviorSubject и дал ему какое-либо случайное начальное значение. Таким образом, теперь он отправляет начальное значение одному компоненту в начальный момент времени, а затем отправляет обновленное значение всем подписчикам при его обновлении.

Так что я думаю, что решить мою проблему.