面试题答案
一键面试-
服务中管理语言和地区状态
- 创建一个服务,例如
LanguageAndRegionService
。 - 在服务中定义属性来存储当前语言和地区状态,比如:
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class LanguageAndRegionService { private _language: string; private _region: string; constructor() { // 可以设置默认值 this._language = 'en'; this._region = 'US'; } get language(): string { return this._language; } set language(value: string) { this._language = value; } get region(): string { return this._region; } set region(value: string) { this._region = value; } }
- 提供方法来更新语言和地区状态,其他组件可以通过注入该服务来获取和更新这些状态。
- 创建一个服务,例如
-
组件中通过
CurrencyPipe
实现货币格式动态更新- 在组件中注入
LanguageAndRegionService
和CurrencyPipe
。
import { Component } from '@angular/core'; import { CurrencyPipe } from '@angular/common'; import { LanguageAndRegionService } from './language - and - region.service'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html' }) export class MyComponent { currencyValue: number = 1000; constructor(private languageAndRegionService: LanguageAndRegionService, private currencyPipe: CurrencyPipe) {} getFormattedCurrency() { const locale = this.languageAndRegionService.language + '-' + this.languageAndRegionService.region; return this.currencyPipe.transform(this.currencyValue, 'currency', 'code', '1.2 - 2', locale); } }
- 在模板中调用获取格式化货币的方法:
<div> Formatted Currency: {{ getFormattedCurrency() }} </div>
- 当语言或地区在服务中更新时,组件会检测到变化并重新调用
getFormattedCurrency
方法,从而实现货币格式的动态更新。同时,为了确保组件能及时检测到服务中的变化,可以使用BehaviorSubject
或Observable
来代替简单的属性,这样在值变化时可以通知组件进行更新。例如,修改LanguageAndRegionService
如下:
import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class LanguageAndRegionService { private _languageSubject = new BehaviorSubject<string>('en'); private _regionSubject = new BehaviorSubject<string>('US'); get language$() { return this._languageSubject.asObservable(); } get region$() { return this._regionSubject.asObservable(); } setLanguage(language: string) { this._languageSubject.next(language); } setRegion(region: string) { this._regionSubject.next(region); } }
- 组件中订阅这些
Observable
:
import { Component, OnInit } from '@angular/core'; import { CurrencyPipe } from '@angular/common'; import { LanguageAndRegionService } from './language - and - region.service'; import { takeUntil } from 'rxjs/operators'; import { Subject } from 'rxjs'; @Component({ selector: 'app - my - component', templateUrl: './my - component.html' }) export class MyComponent implements OnInit { currencyValue: number = 1000; private destroy$ = new Subject<void>(); constructor(private languageAndRegionService: LanguageAndRegionService, private currencyPipe: CurrencyPipe) {} ngOnInit() { this.languageAndRegionService.language$.pipe(takeUntil(this.destroy$)).subscribe(() => { this.updateCurrencyFormat(); }); this.languageAndRegionService.region$.pipe(takeUntil(this.destroy$)).subscribe(() => { this.updateCurrencyFormat(); }); } updateCurrencyFormat() { const locale = this.languageAndRegionService.language + '-' + this.languageAndRegionService.region; this.formattedCurrency = this.currencyPipe.transform(this.currencyValue, 'currency', 'code', '1.2 - 2', locale); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } }
- 在组件中注入