#angular #google-maps
Вопрос:
Я пытаюсь создать угловое приложение с компонентами angular goggle maps. В моем приложении есть переключатель темных и светлых тем. Я создал два стиля карты — ночной стиль для темной темы и светлую версию для светлой темы соответственно. Когда тема меняется, я обновляю параметры карты, чтобы изменить идентификатор карты в соответствии с выбранной темой. Но это не отражается на внешнем виде карты. Мои маркеры на карте в порядке. Поэтому я не добавил сюда эту часть кода. Кроме того, пожалуйста, обратите внимание, что я замаскировал свои идентификаторы карты в приведенном ниже коде.
Мои карты компонент ts
@Input() position: GeolocationPosition;
public markers: any[] = [];
public options: google.maps.MapOptions;
public mapId: string;
private darkModeKey: string = "dark-mode";
public themingSubscription: Subscription;
constructor(
private httpClient: HttpClient,
private secretsService: SecretsService,
private themingService: ThemingService,
private storageService: StorageService,
) { }
ngOnInit(): void {
this.setMapOptions();
this.loadMarkers();
this.themingSubscription = this.themingService.theme.subscribe((theme: string) => {
this.setMapOptions();
});
}
private setMapOptions()
{
this.options = {
center: {
lat: this.position.coords.latitude,
lng: this.position.coords.longitude
},
zoom: 14,
mapId: this.storageService.getItemByKey(this.darkModeKey) ?
<dark-map-id> :
<light-map-id>,
maxZoom: 30,
minZoom: 5,
} as google.maps.MapOptions;
}
HTML
<div>
<google-map [options]="options" [width]="700" [height]="500" >
<map-marker *ngFor="let marker of markers" [position]="marker.position" [label]="marker.label"
[title]="marker.title" [options]="marker.options"></map-marker>
</google-map>
</div>
Что я делаю не так? Или это какая-то проблема с компонентами карт?
Комментарии:
1. Вы пытались запустить обнаружение изменений после установки параметров в
this.options
? angular.io/api/core/…2. @RomanA. Я пробовал ниже, но безрезультатно. this.themingSubscription = this.themingService.theme.subscribe((тема: строка) => { this.setMapOptions(); this.ref.DetectChanges(); });
Ответ №1:
Это может быть проблемой с тем, что Angular не запускает обнаружение изменений, потому что при каждом this.options
изменении ссылка на переменную не меняется. Следовательно, angular считает, что это одно и то же значение.
Попробуй
this.options = {...this.options,
center: {
lat: this.position.coords.latitude,
lng: this.position.coords.longitude
},
zoom: 14,
mapId: this.storageService.getItemByKey(this.darkModeKey) ?
<dark-map-id> :
<light-map-id>,
maxZoom: 30,
minZoom: 5,
}
Выполнение этого способом es6 изменяет ссылку на переменную, поскольку она создает копию оригинала this.options
.