2016-12-22 1 views
0

Cette question concerne une application web construite à l'aide de l'API Javascript d'ArcGIS 3.18. J'essaye d'ajouter un choix de dojo au titre d'une infoWindow. La boîte de sélection est destinée à être remplie avec la liste des résultats identifiés. J'essaie de deux façons différentes:Ajout d'un élément html à infoWindow - API Javascript ArcGIS 3.18

1) Ajout de la liste déroulante déclarative en utilisant html:

var template = new esri.InfoTemplate(layerName + "<br/><select id="id_select" data-dojo-type="dijit/form/Select"</select>,"<br/> FID : ${FID}"); 

Le combobox est là, mais je ne sais pas comment accéder au combobox d'ajouter les options dynamiquement (via addOptions). Je ferais normalement dijit.byId ("id_select"), mais vu qu'il n'existe pas jusqu'à ce qu'il soit créé ... Je ne suis pas sûr de savoir comment procéder de cette façon.

2) Programmé Avec le code ci-dessous, le titre affiche des informations concernant le widget dijit/form/select (Il affiche: [object HTML TableElement]), mais pas le widget lui-même. Vous vous demandez si cela peut être rectifié en utilisant dijitStartup(), mais je ne peux pas avoir compris comment l'utiliser (en train d'essayer quelque chose dans le sens de myTemplate.startupDijits (mySelectBox) - pas avec ces noms de variables). J'ai essayé d'utiliser domConstruct comme ça example

var identifyTask, identifyParams, idPoint; 
var identifyResults; 

require([ 
    "esri/dijit/Popup", 
    "esri/tasks/IdentifyTask", 
    "esri/tasks/IdentifyParameters", 
    "dijit/form/Select", 
    "dojo/dom-construct", 
    "dojo/promise/all", 
    "dojo/domReady!" 
], function (
    Popup, IdentifyTask, IdentifyParameters, Select, domConstruct, All 
) { 
    var identifySelect; 

    //dojo.connect(window.myMap, "onLoad", mapReady); 
    mapReady(window.myMap); 

    function mapReady(map) { 
    dojo.connect(window.myMap, "onClick", runIdentifies); 
    } 

    function runIdentifies(evt) { 
    identifyResults = []; 
    idPoint = evt.mapPoint; 
    var layers = dojo.map(window.myMap.layerIds, function (layerId) { 
     return window.myMap.getLayer(layerId); 
    }); 
    layers = dojo.filter(layers, function (layer) { 
     if (layer.visibleLayers[0] !== -1) { 
     return layer.getImageUrl && layer.visible 
     } 
    }); //Only dynamic layers have the getImageUrl function. Filter so you only query visible dynamic layers 
    var tasks = dojo.map(layers, function (layer) { 
     return new IdentifyTask(layer.url); 
    }); //map each visible dynamic layer to a new identify task, using the layer url 
    var defTasks = dojo.map(tasks, function (task) { 
     return new dojo.Deferred(); 
    }); //map each identify task to a new dojo.Deferred 
    var params = createIdentifyParams(layers, evt); 

    var promises = []; 

    for (i = 0; i < tasks.length; i++) { 
     promises.push(tasks[i].execute(params[i])); //Execute each task 
    } 

    var allPromises = new All(promises); 
    allPromises.then(function (r) { showIdentifyResults(r, tasks); }); 
    } 

    function showIdentifyResults(r, tasks) { 
    var results = []; 
    var taskUrls = []; 
    var resultNames = []; 


    r = dojo.filter(r, function (result) { 
     return r[0]; 
    }); 
    for (i = 0; i < r.length; i++) { 
     results = results.concat(r[i]); 
     for (j = 0; j < r[i].length; j++) { 
     taskUrls = taskUrls.concat(tasks[i].url); 
     } 
    } 
    results = dojo.map(results, function (result, index) { 
     var feature = result.feature; 
     var layerName = result.layerName; 
     var serviceUrl = taskUrls[index]; 

     resultNames.push({ 
     value: result.layerName, 
     label: result.layerName 
     }); 
     feature.attributes.layerName = result.layerName; 

     var identifiedList = getIdentifiedList(resultNames); 
     console.log(identifiedList); 

     var template = new esri.InfoTemplate(); 
     template.setTitle(identifiedList); 
     feature.setInfoTemplate(template); 

     var resultGeometry = feature.geometry; 
     var resultType = resultGeometry.type; 
     return feature; 
    }); 


    if (results.length === 0) { 
     window.myMap.infoWindow.clearFeatures(); 
    } else { 
     window.myMap.infoWindow.setFeatures(results); 
    } 


    window.myMap.infoWindow.show(idPoint); 

    identifySelect.on('change', function(evt) { 
     var identIndex = identifySelect.get("value"); 
     console.log(identIndex); 
     window.myMap.infoWindow.select(identIndex); 
    }); 

    return results; 
    } 

    function getIdentifiedList(options) { 
    identifySelect = new Select({ 
     name: "identifySelect", 
     id: "id_select", 
     options: options 
    }, domConstruct.create("select")); 
    return identifySelect.domNode; 
    } 

    function createIdentifyParams(layers, evt) { 
    var identifyParamsList = []; 
    identifyParamsList.length = 0; 
    dojo.forEach(layers, function (layer) { 
     var idParams = new esri.tasks.IdentifyParameters(); 
     idParams.width = window.myMap.width; 
     idParams.height = window.myMap.height; 
     idParams.geometry = evt.mapPoint; 
     idParams.mapExtent = window.myMap.extent; 
     idParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_VISIBLE; 
     var visLayers = layer.visibleLayers; 
     if (visLayers !== -1) { 
     var subLayers = []; 
     for (var i = 0; i < layer.layerInfos.length; i++) { 
      if (layer.layerInfos[i].subLayerIds == null) 
      subLayers.push(layer.layerInfos[i].id); 
     } 
     idParams.layerIds = subLayers; 
     } else { 
     idParams.layerIds = []; 
     } 
     idParams.tolerance = 5; 
     idParams.returnGeometry = true; 
     identifyParamsList.push(idParams); 
    }); 
    return identifyParamsList; 
    } 

}); 
+0

pouvez-vous créer violon ou d'un échantillon de course ... –

Répondre

0

Salut c'est un peu vieux, mais je vais donner un coup de feu. J'espère que cela répond à votre question. Par conséquent, si le problème consiste à accéder à infoWindow, vous devez configurer un programme d'écoute pour sa création.

on(map.infoWindow, "show", function() { 
      // do something 
}) 

J'ai un violon qui montre comment accéder InfoWindow lors de la création: https://jsfiddle.net/kreza/jpLj5y4h/