Атрибуты всплывающего поля ArcGIS Javascript API 4.14 не отображаются - PullRequest
0 голосов
/ 19 февраля 2020

Я использую webamp для отображения карты, созданной в ArcGIS (Javascript API на PHP веб-сайте). На карте также появляется всплывающее окно при нажатии на точки слоя. Недавно я обновил версию 4.14 с 4.13. После обновления всплывающее окно не работает должным образом. У меня есть собственный шаблон всплывающих окон. Изучив документацию, я узнал, что там требуется функция возврата, чтобы показать пользовательский div во всплывающем окне. Приведенный ниже код, который я добавил, чтобы показать мои собственные всплывающие окна.

var template = { content: function(){ var div = document.createElement("div"); div.className = "myClass"; div.innerHTML = "<span>My custom content!</span>"; return div; } }

layers[layerIndex].popupTemplate = template;

Теперь всплывающее окно выглядит нормально. Но я должен показать значения полей во всплывающем окне. Я использовал обязательные атрибуты поля в двойных скобках, например: {Имя}. Но в последней версии значения полей не появляются, когда я использую то же самое.

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

popupTemplate = {
title: "{Name}",
content: '<div id="popup_address">{Address}</div><div class="right"><div href="#" id="popupRight" class="toggle"><p onClick="openPopupDetails({FACILITYID})">+</p></div></div>' };

layers[layerIndex].popupTemplate = popupTemplate;

Пожалуйста, помогите мне решить эту проблему.

Спасибо.

Полный код веб-карты и пользовательской всплывающей карты. js

// The map classes and includ1a65d527bfd04cc180c87edf0908907bes
require([
  "esri/views/MapView",
  "esri/WebMap",
  "esri/widgets/Search",
  "esri/widgets/Zoom",
  "esri/widgets/Locate"
], function(MapView, WebMap, Search, Zoom, Locate) {
  var webmap = new WebMap({
    portalItem: {
      id: "d1ca798d8c7d4afab8983d911df8326b"
    }
  });

  var view = new MapView({
    map: webmap,
    container: "map",
    center: [-95.9406, 41.26],
    zoom: 16,
    maxZoom: 21,
    minZoom: 13,
    basemap: "topo",

    ui: {
      components: ["attribution"]
    }
  });

  webmap
    .load()
    .then(function() {
      return webmap.basemap.load();
    })
    .then(function() {
      let allLayers = webmap.allLayers;
      console.log(allLayers);

      var promises = allLayers.map(function(layer) {
        return layer.load();
      });
      return Promise.all(promises.toArray());
    })
    .then(function(layers) {
      // Position of the popup in relation to the selected feature.
      view.popup.alignment = "top-center";
      // To disable the collapse functionality
      view.popup.collapseEnabled = false;
      // A spinner appear at the pointer
      view.popup.spinnerEnabled = false;
      // To disable the dock (The popup will be appear in bottom or any corner of the window)
      view.popup.dockEnabled = false;
      // Disable the pagination
      view.popup.featureNavigationEnabled = false;
      // Popup template details, Keep only name and address in the popup and avoid all other details
      view.popup.viewModel.actions.getItemAt(0).visible = false;

      // view.on("click", function(event) {
      // keep a delay to align the popup and the pointer together positioned to the map center
      // Add animation only if the browser not IE
      // });

      layers.forEach(function(popupLayers, layerIndex) {
        console.log(popupLayers);

        var template = {
          title: "{Name}",
          content: function() {
            var div = document.createElement("div");
            div.className = "myClass";
            div.innerHTML = "<span>{Address}</span>";
            return div;
          }
        };
        layers[layerIndex].popupTemplate = template;

        // popupTemplate = {
        //   title: "{Name}",
        //   content:
        //     '<div id="popup_address">{Address}</div><div class="right"><div href="#" id="popupRight" class="toggle"><p onClick="openPopupDetails({FACILITYID})">+</p></div></div>'
        // };
        // layers[layerIndex].popupTemplate = popupTemplate;
      });

      // To close the popup when hit on esc button
      document.onkeyup = function(evt) {
        var key = evt.keyCode;
        if (key == 27) {
          view.popup.close();
        }
      };
    })
    .catch(function(error) {
      //   console.log(error);
    });
});

Индекс. php

<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />

<title>Load a basic WebMap - 4.14</title>

    <style>
      html,
      body,
      #map {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>

    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.14/esri/themes/light/main.css"
    />

    <script src="https://js.arcgis.com/4.14/"></script>
<script src="map.js"></script>
  </head>

  <body>
    <div id="map"></div>
  </body>
</html>

Я изменил код,

 for (let i = 2; i < layers.length; i++) {
        var template = {
          title: "{Name}",
          content: function() {
            var div = document.createElement("div");
            div.innerHTML =
              '<div id="popup_address">{Address}</div><div class="right"><div href="#" id="popupRight" class="toggle"><p onClick="openPopupDetails({FACILITYID})">+</p></div></div>';
            return div;
          }
        };
        layers[i].popupTemplate = template;
        console.log(layer[i]);
      }

Когда я применяю пользовательский div, часть {Address} не отображается. Похоже, что сам {Address}.

1 Ответ

0 голосов
/ 19 февраля 2020

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

popupTemplate = {
    title: "{Name}",
    content: popupContentChange
}

layers[layerIndex].popupTemplate = template;

function popupContentChange(feature) {
    let div = document.createElement("div");
    div.className = "myClass";
    div.innerHTML = "<span>"+feature.graphic.attributes.Address+"</span>";
    return div;
}

В документации API есть несколько примеров, посмотрите здесь. Просто для примера, ArcGIS JavaScript Примеры API - Введение в всплывающие окна

Вот пример, который я сделал, чтобы вы взяли ваш код за основу, добавив некоторые исправления для отображения того, что вы хотите.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <title>Sketch Feature Coords</title>
    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.14/esri/themes/light/main.css"
    />
    <script src="https://js.arcgis.com/4.14/"></script>
    <style>
      html,
      body,
      #map {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
    <script>
      require([
        "esri/views/MapView",
        "esri/WebMap",
        "esri/widgets/Search",
        "esri/widgets/Zoom",
        "esri/widgets/Locate"
      ], function(MapView, WebMap, Search, Zoom, Locate) {
        var webmap = new WebMap({
          portalItem: {
            id: "d1ca798d8c7d4afab8983d911df8326b"
          }
        });

        var view = new MapView({
          map: webmap,
          container: "map",
          center: [-95.9406, 41.26],
          zoom: 16,
          maxZoom: 21,
          minZoom: 13,
          basemap: "topo",
          ui: {
            components: ["attribution"]
          }
        });
        webmap
          .load()
          .then(function() {
            return webmap.basemap.load();
          })
          .then(function() {
            let allLayers = webmap.allLayers;
            console.log(allLayers);
            var promises = allLayers.map(function(layer) {
              return layer.load();
            });
            return Promise.all(promises.toArray());
          })
          .then(function(layers) {
            // Position of the popup in relation to the selected feature.
            view.popup.alignment = "top-center";
            // To disable the collapse functionality
            view.popup.collapseEnabled = false;
            // A spinner appear at the pointer
            view.popup.spinnerEnabled = false;
            // To disable the dock (The popup will be appear in bottom or any corner of the window)
            view.popup.dockEnabled = false;
            // Disable the pagination
            view.popup.featureNavigationEnabled = false;
            // Popup template details, Keep only name and address in the popup and avoid all other details
            view.popup.viewModel.actions.getItemAt(0).visible = false;

            // it is only going to work on the last two layers
            // those are the one that have fields: Name and Address
            for (let i = 2; i < layers.length; i++) {
              var template = {
                title: "{Name}",
                content: "<span>Address: {Address}</span>"
              };
              layers[i].popupTemplate = template;
              console.log(layer[i]);
            }
            
            // To close the popup when hit on esc button
            document.onkeyup = function(evt) {
              var key = evt.keyCode;
              if (key == 27) {
                view.popup.close();
              }
            };
          })
          .catch(function(error) {
            console.log(error);
          });
    });
    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>

Если вы хотите использовать функцию в качестве контента, вы должны установить параметр outFields, чтобы включить поля, которые вы хотите использовать в функции. Выбранный объект передается в качестве параметра функции, а внутри вы используете feature.graphic.attributes для доступа к атрибутам. Это должно работать,

var template = {
    title: "{Name}",
    // content: "<span>Address: {Address}</span>"
    content: function(feature) {
        console.log(feature);
        var div = document.createElement("div");
        div.className = "myClass";
        div.innerHTML = "<span>Address:"+feature.graphic.attributes.Address+"</span>";
        return div;
    },
    outFields: ["Name", "Address"]
};
...