0

Here is my code in which I am setting and calling a popup in arcgis-js-api (4.xx) via one rest call... the problem I have an external variable I would like to populate within the field 'place' this external variable doesn't come from the same rest call, I have the value, not sure why it won't accept it in the field?

var place = 'something cool x';
........
   var popuptemp = {
          title: "Shake Intensity",
          content: [{
            type: "fields",
            fieldInfos: [{
                fieldName: "grid_value",
                label: "Grid Value"
              },
              {
                fieldName: "id",
                label: "id"
              },
              {
                fieldName: "place",
                label: "place"
              },
              {
                fieldName: "ObjectID",
                label: "ObjectID"
              },
              {
                fieldName: "url",
                label: "Url"
              }
            ]
          }]
        }

        fl = new FeatureLayer({
          source: gras,
          objectIdField: "ObjectID",
          geometryType: "polygon",
          fields: [{
            name: "ObjectID",
            alias: "ObjectID",
            type: "oid"
          }, {
            name: "id",
            alias: "id",
            type: "string"
          }, {
            name: place <--------------------- tried just calling the var here with no avail, no errors, just nothing displays
            alias: "place",
            type: "string"
          }, {
            name: "url",
            alias: "url",
            type: "string"
          }, {
            name: "grid_value",
            alias: "grid_value",
            type: "double"
          }],
          renderer: renderer,
          popupEnabled: true,
          popupTemplate: popuptemp
        });

        map.add(fl);

1 Answer 1

1

You will not be able to add external data like a field. But you could use a function to define the content. Take a look at this example that I made for you, in there author is the global value.

<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>ArcGIS API for JavaScript Hello World App</title>
  <style>
    html,
    body,
    #viewDiv {
      padding: 0;
      margin: 0;
      height: 100%;
      width: 100%;
    }
    .disclaimer {
      font-size: 14px;
      font-style: italic;
      color: white;
      background-color: black;
    }
  </style>

  <link rel="stylesheet" href="https://js.arcgis.com/4.15/esri/css/main.css">
  <script src="https://js.arcgis.com/4.15/"></script>

  <script>
    require([
      'esri/Map',
      'esri/views/MapView',
      'esri/layers/FeatureLayer'
    ], function (Map, MapView, FeatureLayer) {

      let author = 'by @cabesuon';

      const map = new Map({
        basemap: 'streets-navigation-vector'
      });

      const view = new MapView({
        container: 'viewDiv',
        map: map,
        zoom: 12,
        center: {
          latitude: 32.7353,
          longitude: -117.1490
        }
      });

      function toGraphic(lon, lat, ObjectID, title, addrs, url) {
        return {
          geometry: {
            type: 'point',
            longitude: lon,
            latitude: lat
          },
          attributes: {
            ObjectID,
            title,
            addrs,
            url
          }
        }
      }
      
      const graphics = [
        toGraphic(
          -117.1560632,
          32.727482,
          1,
          'Automotive Museum',
          '2080 Pan American Plaza, San Diego, CA 92101, United States',
          'http://sdautomuseum.org/'
        ),
        toGraphic(
          -117.1763293,
          32.7136902,
          2,
          'USS Midway Museum',
          '910 N Harbor Dr, San Diego, CA 92101, United States',
          'http://www.midway.org/'
        ),
        toGraphic(
          -117.2284536,
          32.7641112,
          3,
          'SeaWorld',
          '500 Sea World Dr, San Diego, CA 92109, United States',
          'https://seaworld.com/san-diego'
        ),
        toGraphic(
          -117.1557741,
          32.7360032,
          4,
          'Zoo',
          '2920 Zoo Dr, San Diego, CA 92101, United States',
          'https://zoo.sandiegozoo.org/'
        )
      ];

      function popupContent (feature) {
        const div = document.createElement('div');
        div.innerHTML =
        `Address: ${feature.graphic.attributes.addrs}<br>` +
        `<a href='${feature.graphic.attributes.url}'>${feature.graphic.attributes.url}</a><br><br>` +
        `<span class="disclaimer">${author}</span>`;
        return div;
      }

      const layer = new FeatureLayer({
        source: graphics,
        fields: [
          {
            name: 'ObjectID',
            alias: 'ObjectID',
            type: 'oid'
          }, {
            name: 'title',
            alias: 'title',
            type: 'string'
          }, {
            name: 'addrs',
            alias: 'addrs',
            type: 'string'
          }, {
            name: 'url',
            alias: 'url',
            type: 'string'
          }
        ],
        objectIDField: ['ObjectID'],
        geometryType: 'point',
        renderer: {
          type: 'simple',
          symbol: {
            type: 'text',
            color: 'red',
            text: '\ue61d',
            font: {
              size: 30,
              family: 'CalciteWebCoreIcons'
            }
          }
        },
        popupTemplate: {
          title: '{title}',
          content: popupContent,
          outFields: ['*']
        }
      });
      
      map.add(layer);

    });
  </script>
</head>

<body>
  <div id="viewDiv"></div>
</body>

</html>

Sign up to request clarification or add additional context in comments.

6 Comments

Hey there, thanks for this; so could I define two 'content:' fields? I want to continue to add the fields which I had already working, but just add one custom item from a different rest call? do I simply add another content property i.e. 'content: customFunction,' under the content: with my fields?
or I have to redefine the whole things feeding the other standard fields into the next context as well?
anyway to pass it in without redefining the whole thing for others as well?
What is not working in the pen? ... Which variable are you trying to show that it doesn't?
Hey, I got that part - onto a new challege now; I am trying to write innerHTML inside the popup template title
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.