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(); }
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.
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.
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.
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.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With