I am trying to subscribe to a service I am writing so I can update an mat-autocomplete
input when a language dropdown is changed.
the stackoverflow question I found is;
Delegation: EventEmitter or Observable in Angular
However, when I implement this the subscription method is not firing? I have the following;
My app.component.ts;
import { Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { TranslationEmitterService } from '../../services/translation.emitter.service';
@Component({
selector: 'app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
providers: [ TranslationEmitterService ]
})
export class AppComponent {
constructor(private translate: TranslateService, private translationService: TranslationEmitterService) {
translate.addLangs(["en", "pt", "fr"]);
translate.setDefaultLang('pt');
let browserLang = translate.getBrowserLang();
translate.use(browserLang.match(/en|pt|fr/) ? browserLang : 'en');
}
}
My Component html;
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Select Language
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" (click)="switchLanguage('pt')"><span class="flag-icon flag-icon-gr"></span> Portugese</a>
<a class="dropdown-item" (click)="switchLanguage('en')"><span class="flag-icon flag-icon-gr"></span> English</a>
<a class="dropdown-item" (click)="switchLanguage('fr')"><span class="flag-icon flag-icon-gr"></span> French</a>
</div>
</div>
My Observable Service;
import { Injectable } from '@angular/core'
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class TranslationEmitterService {
private _languageChangedSource = new BehaviorSubject<any>(0);
languageChange$ = this._languageChangedSource.asObservable();
changeLanguage(lang) {
console.log("in change language " + lang);
this._languageChangedSource.next(lang);
}
}
my component for switching the language which calls the change;
import { Injectable, Inject, Component } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { TranslationEmitterService } from '../../../services/translation.emitter.service';
@Component({
selector: 'nav-menu',
templateUrl: './navmenu.component.html',
styleUrls: ['./navmenu.component.css']
})
export class NavMenuComponent {
public isCollapsed = true;
public status = false;
constructor(private translate: TranslateService, private translationEmitterService: TranslationEmitterService) {
}
public switchLanguage(language: string) {
console.log("switching language");
this.translate.use(language);
this.translationEmitterService.changeLanguage(language);
}
}
and finally I subscribe to the event in my component;
ngOnInit() {
this.translationSubscription = this.translationService.languageChange$.subscribe(
// lang => this.refreshAutoCompleteItems(lang)
x => console.log(x)
);
}
A copy of the component is here pastebin
No when I trigger the switchLanguage
method i get the output switching language
and in change language fr
output, but the component observing is not triggering?
Can anyone tell me what I am doing wrong here?