Esri Maps PopupTemplate的内容方法每个功能只调用一次

问题描述 投票:4回答:1

我在Angular应用程序中使用Esri地图,我使用PopupTemplatecontent方法发布的数据将我的弹出窗口渲染为Angular组件:

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

有没有办法强制弹出窗口始终调用content方法,即使它已经针对给定的功能执行了?或者,有没有办法从MapView.popup(或其他我没有考虑过的其他东西)获取属性所属的图层?

如果重要的话,弹出窗口是针对MapImageLayer子层的。

typescript esri arcgis-js-api esri-maps esri-javascript-api
1个回答
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... 
});
© www.soinside.com 2019 - 2024. All rights reserved.