Карта не может быть предоставлена компоненту боковой панели угловой листовки, если не используется пользовательское событие

#angular #typescript #leaflet

#angular #машинописный текст #листовка

Вопрос:

Рассмотрим очень простое приложение Angular 11 с использованием пакетов @asymmetrik/ngx-leaflet и @runette/ngx-leaflet-sidebar. Моя цель — просто правильно отобразить пустую боковую панель.

Рабочий пример

Рабочий пример приведен в этом руководстве (которое, к сожалению, завершается неудачей при запуске на Angular 11 из-за некоторых отсутствующих ссылок на типы и некоторых неправильных определений свойств, но вы можете найти исправленный и упрощенный код здесь).

В примере определен пользовательский компонент osm-map для хранения некоторых сведений о карте:

 <!-- app/osm-map/osm-map.component.html -->
<div class="map-container" leaflet
  [leafletOptions]="options"
  (leafletMapReady)="onMapReady($event)"
></div>
 

интересная часть здесь заключается в том, что исходное событие leafletMapReady , генерируемое сторонним компонентом листовки, фиксируется методом onMapReady() component, который просто сохраняет созданную карту и генерирует новое событие для уведомления остальной части приложения о наличии новой карты:

 // app/osm-map/osm-map.component.ts
...
@Output() map$: EventEmitter<Map> = new EventEmitter();
public map: Map;
...
onMapReady(map: Map) {
  this.map = map;
  this.map$.emit(map);
}
 

Затем пользовательский osm-map компонент используется корневым app компонентом, который также определяет элемент управления боковой панелью:

 <!-- app/app.component.html -->
<app-osm-map
  [options]="mapOptions"
  (map$)="receiveMap($event)"
></app-osm-map>

<leaflet-sidebar-control
  [map]="map"
  [options]="sidebarOptions"
></leaflet-sidebar-control>

<div id="sidebar" class="leaflet-sidebar collapsed">
  ...
</div>
 

интересная вещь здесь заключается в том, что мы регистрируем receiveMap() метод в качестве прослушивателя для пользовательского map$ события, сгенерированного osm-map компонентом. Этот прослушиватель не делает ничего, кроме обновления свойства map компонента, которое связано со map свойством leaflet-sidebar-control компонента:

 // app/app.component.ts
...
public map: Map;
...
receiveMap(map: Map) {
  this.map = map;
}
 

Нерабочий пример

Начиная с примера, описанного ранее, я просто хочу сделать это: переместить код из osm-map компонента в корневой app компонент.

Моя идея действительно проста: вместо того, чтобы получать карту из события листовки, а затем отправлять ее снова через другое пользовательское событие, прежде чем оно будет привязано к боковой панели листовки, я могу просто получить карту из листовки и сразу привязать ее к боковой панели:

 <!-- app/app.component.html -->
<div class="map-container" leaflet
  [leafletOptions]="mapOptions"
  (leafletMapReady)="receiveMap($event)"
></div>

<leaflet-sidebar-control
  [map]="map"
  [options]="sidebarOptions"
></leaflet-sidebar-control>
 
 // app/app.component.ts
...
public map: Map;
...
receiveMap(map: Map) {
  this.map = map;
}
 

Однако это не работает: боковая панель неправильно зарегистрирована на карте, ее HTML-код не перемещается под элементом карты и неправильно отображается справа.

У меня сложилось впечатление, что я чего-то не понимаю в отношении того, как карта привязана к боковой панели листовки: возможно, то, как это делается во втором примере, привязка выполняется до фактического создания карты или что-то в этом роде?