Метод содержимого 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...
});