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

Я использую карты Esri внутри приложения Angular и отображаю мои всплывающие окна как компоненты Angular с данными, опубликованными методом PopupTemplate 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 подслоев.

1 Ответ

0 голосов
/ 14 февраля 2019

Это нормально, что функция 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... 
});
...