0

我正在尝试在动态地图服务图层上使用识别工具并显示一个显示附加到记录的图像的信息窗口。我必须四处寻找并获取要素层,但这没问题。我遇到了延期的问题。

这就是问题所在:identify 任务返回一个dojo 延迟对象。当延迟解决时,我有一个回调。在该回调函数中,我运行另一个名为 queryAttachmentInfos 的函数。运行时,“返回功能”行将在 queryAttachmentInfos 函数之前触发。我不知道为什么。回调中的所有内容不应该同步发生吗?如何让回调函数等待 queryAttachmentInfo 完成?我正在使用 setTimeout 强制脚本等待一秒钟,这有时会起作用,但我知道这不是一个好的解决方案。

欢迎任何帮助。

下面的代码...

function executeIdentifyTask(evt) {
        identifyParams.geometry = evt.mapPoint;
        identifyParams.mapExtent = map.extent;

        var deferred = identifyTask.execute(identifyParams);

        deferred.addCallback(function(response) {     

          return dojo.map(response, function(result) {
            var feature = result.feature;
            var fLayerPath = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0"
            var featureLayer = new esri.layers.FeatureLayer(fLayerPath);
            var objID = feature.attributes.OBJECTID;
            feature.attributes.layerName = result.layerName;
            //alert(result.layerId);
            if(result.layerName === 'Tax Parcels'){
                featureLayer.queryAttachmentInfos(6737858, function (infos) {
                            if (infos.length>0) {
                                el = document.createElement('img');
                                el.setAttribute('src', infos[0].url);
                                t = document.createElement('table');

                                //first row Request Type
                                r = t.insertRow(0); 
                                r.bgColor="#00FFFF";
                                c = r.insertCell(0);
                                c1 = r.insertCell(1);
                                c.innerHTML="Request Type";
                                c1.innerHTML=feature.attributes.building;

                                //second row District
                                r1 = t.insertRow(-1);
                                c2 = r1.insertCell(0);
                                c2_1 = r1.insertCell(1);
                                c2.innerHTML="District";
                                c2_1.innerHTML=feature.attributes.UNIT;


                                //third row Status
                                r2 = t.insertRow(-1);
                                r2.bgColor="#00FFFF";
                                c3 = r2.insertCell(0);
                                c3_1 = r2.insertCell(1);
                                c3.innerHTML="Status";
                                c3_1.innerHTML=feature.attributes.PARCELID ;

                                var len = infos.length;
                                    for (var i = 0; i < len;i++)
                                    {
                                        newRow = t.insertRow(-1);
                                        newCell = newRow.insertCell(0);
                                        newCell.colSpan=2;
                                        newCell.innerHTML="<a href="+infos[i].url+"/><img src="+infos[i].url+"/>";
                                        //els[i]= document.createElement('img');
                                        //els[i].setAttribute('src', infos[i].url);

                                        //alert(infos[i].url);

                                    }
                                var template = new esri.InfoTemplate("", t);
                                feature.setInfoTemplate(template);
                                //return feature;
                            }
                        else
                        {
                            var template = new esri.InfoTemplate("", "${Postal Address} <br/> Different: ${First Owner Name}");
                            feature.setInfoTemplate(template);
                            //eturn feature;
                        }
                        });
              console.log(feature.attributes.PARCELID);

            }
            else if (result.layerName === 'Building Footprints'){
              var template = new esri.InfoTemplate("", "Parcel ID: ${PARCELID}");
              feature.setInfoTemplate(template);
              //return feature;
            }
            return feature;
          });
        });
        setTimeout(function(){map.infoWindow.setFeatures([ deferred ])},1000); 
        map.infoWindow.show(evt.mapPoint);
      }
4

2 回答 2

1

问题似乎featureLayer.queryAttachmentInfos()是它本身是异步的,所以在“Tax Parcels”的情况下,map.infoWindow.setFeatures()只能map.infoWindow.show()在异步活动完成时调用。

同时,在“Building Footprints”的情况下,map.infoWindow.setFeatures()可以map.infoWindow.show(evt.mapPoint)同步调用(在外部异步回调中)。

这意味着应该从两个地方调用一小段代码。您可以重复几行代码或编写一个工作函数,如下所示:

var showInfoWindow = function(feature, tpl) {
    // A utility function which creates and populates an infowindow
    // and shows it at evt.mapPoint
    feature.setInfoTemplate( new esri.InfoTemplate("", tpl) );
    map.infoWindow.setFeatures(feature);
    map.infoWindow.show(evt.mapPoint);
}

这里是上下文(为清楚起见,删除了所有笨重的 DOM 构建):

function executeIdentifyTask(evt) {
    identifyParams.geometry = evt.mapPoint;
    identifyParams.mapExtent = map.extent;

    var showInfoWindow = function(feature, tpl) {
        // A utility function which creates and populates an infowindow
        // and shows it at evt.mapPoint
        feature.setInfoTemplate( new esri.InfoTemplate("", tpl) );
        map.infoWindow.setFeatures(feature);
        map.infoWindow.show(evt.mapPoint);
    }

    var deferred = identifyTask.execute(identifyParams);

    deferred.addCallback(function(response) {
        return dojo.map(response, function(result) {
            var feature = result.feature;
            //var objID = feature.attributes.OBJECTID;//???
            feature.attributes.layerName = result.layerName;
            if(result.layerName === 'Tax Parcels') {
                var fLayerPath = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0";
                var featureLayer = new esri.layers.FeatureLayer(fLayerPath);
                featureLayer.queryAttachmentInfos(6737858, function(infos) {
                    var t, tpl;
                    if(infos.length > 0) {
                        t = document.createElement('table');
                        //***** Reinsert several lines of code here *****
                        //***** Remember to localize variables with `var` *****
                        tpl = t;
                    }
                    else {
                        tpl = "${Postal Address} <br/> Different: ${First Owner Name}";
                    }
                    showInfoWindow(feature, tpl);//<<<<< create, populate and display an infowindow
                });
            }
            else if (result.layerName === 'Building Footprints') {
                showInfoWindow(feature, "Parcel ID: ${PARCELID}");//<<<<< create, populate and display an infowindow
            }
            //return feature;//???
        });
    });
}

我所做的只是在没有任何关于 dojo 或 arcgis 的特定知识的情况下随机播放。除非我出错,否则一切都应该正常工作。也就是说,我只能测试语法错误,所以准备好进行一些调试。并记住将笨重的表格构建线粘贴回去。

于 2013-06-02T23:20:24.027 回答
0

BB,我尝试了代码,但无法正常工作。看起来它应该可以工作,或者至少应该在地图上显示一个信息窗口。单步执行它会填充显示窗口所需的所有对象。不知道为什么它没有......

如果我在第一篇文章中不清楚,我深表歉意。一个问题是识别任务可以(并且通常确实)返回一组特征。

无论我怎么看,“map.infoWindow.setFeatures([ deferred ]);” 行在 queryAttachmentInfo 触发之前触发。我有一个愚蠢的解决方法,我使用 window.setTimeout 函数等待一秒钟,但这并不能保证所有 queryAttachmentInfos 都会得到解决。

于 2013-06-03T21:04:20.893 回答