Метод содержимого Esri Maps PopupTemplate вызывается только один раз для каждой функции

Я использую карты Esri в приложении Angular и отображаю всплывающие окна как компоненты Angular с данными, опубликованными из PopupTemplate"s content метод:

layer.popupTemplate = new PopupTemplate({
  content: (feature: { graphic: __esri.Graphic }) => {
    this.publishPopupData(layer, feature.graphic.attributes);
    return popupComponent.viewContainerRef.element.nativeElement;
  },
  // other properties... 
});

Это работает хорошо, за исключением случая, когда в данной точке есть несколько функций. Когда пользователь циклически перебирает функции, если он / она возвращается к функции, которая уже была отображена, метод содержимого не выполняется, поэтому всплывающие данные не публикуются.

Я могу получить доступ к выбранной в данный момент функции на MapViewвсплывающее окно, но мне нужно знать, из какого слоя пришел объект, чтобы правильно публиковать данные (каждый слой предъявляет уникальные требования для обработки данных ArcGIS в моделях, используемых всплывающими окнами).

mapView.popup.watch('selectedFeature', (graphic: __esri.Graphic) => {
  const layer = ???;
  this.publishPopupData(layer, graphic.attributes);
});

Номинально, graphic.layer должен содержать ссылку на слой, но в моем случае это всегда null,

Есть ли способ заставить всплывающие окна всегда вызывать метод содержимого, даже если он уже был выполнен для данной функции? Кроме того, есть ли способ получить слой, к которому принадлежит элемент MapView.popup (или что-то еще я не учел)?

Если это имеет значение, всплывающие окна предназначены для MapImageLayer подуровни.

0 ответов

Это нормально, что content функция не вызывается снова, когда вы возвращаетесь к всплывающему меню, которое уже отображалось. Я думаю, что проблема заключается в том, что вы перезаписываете popupComponent переменная каждый раз, когда content функция называется. Вместо, this.publishPopupData() должен вернуть что-то, что вы добавите в новый HTML-элемент.

Я предоставлю javascript ответ, потому что я не очень хорошо знаю машинопись

layer.popupTemplate = new PopupTemplate({
  content: function(graphic) {
    var popupElement = document.createElement("div");
    //use popupElement.innerHTML if this.publishPopupData() returns a string or use popupElement.appendChild() if it's an html element
    popupElement.innerHTML = this.publishPopupData(layer, graphic.attributes); 
    return popupElement;
  },
  // other properties... 
});
Другие вопросы по тегам