Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular2 detect change in service

Tags:

angular

I have one component in Angular2 which is changing a "lang" class variable in my service translate.service.ts. In another component I am fetching a dict with the translation on init. If the first component changes the services language later, I want to refetch the dict in the second component automatically. How do I do that?

First component:

  setLang(lang) {     this._translateService.setLang(lang);   } 

Service:

dict = { "en": {}}; lang = "en";  setLang(lang) {     this.lang = lang; }  getLang() {     return this.dict; } 

Second component:

ngOnInit() {     this.dict = this._translateService.getDict(); } 
like image 392
rablentain Avatar asked Mar 08 '16 14:03

rablentain


People also ask

How does Angular detect changes in service?

The answer is using observables. To run the change detector manually: Inject ChangeDetectorRef service in the component. Use markForCheck in the subscription method to instruct Angular to check the component the next time change detectors run. On the ngOnDestroy() life cycle hook, unsubscribe from the observable.

What is OnPush change detection in Angular?

The OnPush strategy changes Angular's change detection behavior in a similar way as detaching a component does. The change detection doesn't run automatically for every component anymore. Angular instead listens for specific changes and only runs the change detection on a subtree for that component.

What is the default component change detection strategy?

default change detection strategy. With this strategy, Angular will have no assumption on the component's dependency and will check every component from the component tree from top to bottom every time an event triggers change detection on browser events, timers, XHRs, and promises.

What is ChangeDetectorRef?

A change-detection tree collects all views that are to be checked for changes. Use the methods to add and remove views from the tree, initiate change-detection, and explicitly mark views as dirty, meaning that they have changed and need to be re-rendered.


1 Answers

Edit:

Following the Mark's comment, a Subject / Observable should be preferred:

EventEmitter should only be used for emitting custom Events in components, and that we should use Rx for other observable/event scenarios.

Original Answer:

You should use an EventEmitter in the service:

export class LangService {   langUpdated:EventEmitter = new EventEmitter();    setLang(lang) {     this.lang = lang;     this.langUpdated.emit(this.lang);   }    getLang() {     return this.dict;   } } 

Components could subscribe on this event to be notified when the lang property is updated.

export class MyComponent {   constructor(private _translateService:LangService) {   }    ngOnInit() {     this._translateService.langUpdated.subscribe(       (lang) => {         this.dict = this._translateService.getDict();       }     );   } } 

See this question for more details:

  • Delegation: EventEmitter or Observable in Angular
  • Delegation: EventEmitter or Observable in Angular
like image 200
Thierry Templier Avatar answered Oct 04 '22 12:10

Thierry Templier