【发布时间】:2018-04-06 23:32:21
【问题描述】:
我正在尝试订阅我正在编写的服务,以便在更改语言下拉列表时更新mat-autocomplete 输入。
我发现的stackoverflow问题是;
Delegation: EventEmitter or Observable in Angular
但是,当我实现这个时,订阅方法没有触发?我有以下内容;
我的 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');
}
}
我的组件 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>
我的可观察服务;
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);
}
}
用于切换调用更改的语言的组件;
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);
}
}
最后我订阅了组件中的事件;
ngOnInit() {
this.translationSubscription = this.translationService.languageChange$.subscribe(
// lang => this.refreshAutoCompleteItems(lang)
x => console.log(x)
);
}
组件的副本在这里pastebin
没有,当我触发switchLanguage 方法时,我得到输出switching language 和in change language fr 输出,但组件观察没有触发?
谁能告诉我我在这里做错了什么?
【问题讨论】:
-
尝试直接订阅 this.translationService._languageChangedSource。我认为不需要 asObservable 。我已经编写了没有它的代码并且它可以工作。
-
如果您关心封装,则需要它。您可能只想公开可观察流,但将发射逻辑保留在服务方法的外观后面。
-
您的代码看起来不错,控制台是否显示任何错误?
-
@Vikas 不,我也看不到任何错误,只是
console.log(x)没有触发。 -
@Vikas 还要在程序最初运行时添加它确实会触发订阅,因为 x 的值记录为“0”?
标签: angular