Select to view content in your preferred language

Enable default popups for user added layer

3113
3
Jump to solution
03-13-2013 05:34 AM
JoeJones
Deactivated User
Using version 2.5, I have a widget that allows users to add their own dynamic services to the TOC by entering the service URL and selecting a layer.  I'm trying to enable the default identify tool to work for user layers the same way it works when using the "popupconfig" option in the XML config file for a layer.  I can use my widget to add a new layer to the TOC and display it, but nothing happens when I click on a feature.  The popup works if I define the same layer in my XML config file with the popupconfig option.  Has anyone else tried this?  I want to be able to use popups for user added layers without needing a precreated popup XML file or using the IdentifyWidget.

 private function createPopUp(url:String,layer:ArcGISDynamicMapServiceLayer,layerId:int):void  var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); loader.load(new URLRequest(url+"/"+layerId+"?f=json"));  function completeHandler(event:Event):void {  var loader:URLLoader = URLLoader(event.target);  var svc:Object = JSON.decode(loader.data);  var popupFields:Array = [];  var firstfield:String =null;  for each(var field:Object in svc.fields)  {   if(field.name=="OBJECTID"||field.name=="Shape_Length"||field.name=="Shape_Area" || field.name=="Shape")continue;   var popupFieldInfo:PopUpFieldInfo = new PopUpFieldInfo();   if(!firstfield)firstfield=field.name;   popupFieldInfo.fieldName = field.name;   popupFieldInfo.label = field.alias;   popupFieldInfo.visible = true;   popupFieldInfo.format = new PopUpFieldFormat();   popupFields.push(popupFieldInfo);  }  var popUpInfo:PopUpInfo = new PopUpInfo();  // Tell the pop-up info about the field name template  popUpInfo.title = "{"+firstfield+"}";  popUpInfo.popUpFieldInfos = popupFields;    // Create the class factory  var popUpRenderer:ClassFactory = new ClassFactory(PopUpRenderer);  // Set the "popUpInfo" key  popUpRenderer.properties = { "popUpInfo": popUpInfo };  var layerInfoWindowRenderer:LayerInfoWindowRenderer = new LayerInfoWindowRenderer();  layerInfoWindowRenderer.layerId = Number(layerId);  var infoWindowRenderer:ClassFactory = new ClassFactory(PopUpRenderer);  infoWindowRenderer.properties = { popUpInfo: popUpInfo };   var arrLayerInfoWindowRenderer:Array = [];  arrLayerInfoWindowRenderer.push(popUpRenderer);   layer.layerInfoWindowRenderers=arrLayerInfoWindowRenderer; } }
Tags (2)
0 Kudos
1 Solution

Accepted Solutions
KennyHoran
Regular Contributor
I've been working on adding a default infowindow to all layers and have it working with ArcGISDynamicMapServiceLayer and FeatureLayer. Does your layer have any sub-layers?  If so, you'll need to define an infowindow for each sub-layer and place them all in your arrLayerInfoWindowRenderer.  Here's what I'm doing, perhaps it will help.

// Listen for new layers map.addEventListener(MapEvent.LAYER_ADD, onLayerAdd);  private function onLayerAdd(event:MapEvent):void {   if (event.layer is FeatureLayer)   {     // Do FeatureLayer stuff   }   else if (event.layer is ArcGISDynamicMapServiceLayer)   {     // If it's not a basemap, listen for it to load     var layer:ArcGISDynamicMapServiceLayer = event.layer as ArcGISDynamicMapServiceLayer;     if (layer.name.indexOf(" BaseMap") == -1)       layer.addEventListener(LayerEvent.LOAD, onLayerLoad);   } }  // Fetch the fields of all sub-layers private function onLayerLoad(event:LayerEvent):void {   var layer:ArcGISDynamicMapServiceLayer = event.layer as ArcGISDynamicMapServiceLayer;   layer.removeEventListener(LayerEvent.LOAD, onLayerLoad);   layer.getAllDetails(new AsyncResponser(getAllDetailsResult, getAllDetailsFault, layer)); }  // Build an InfoWindow for each sub-layer private function getAllDetailsResult(event:AllDetails, layer:ArcGISDynamicMapServiceLayer):void {   var renderers:Array = [];   for each (var layerDetails:LayerDetails in event.layerDetails)     if (layerDetails.fields)     {       var renderer:LayerInfoWindowRenderer = new LayerInfoWindowRenderer();       var infoWindowRenderer:ClassFactory = new ClassFactory(PopUpRenderer);       infoWindowRenderer.properties = { popUpInfo: configurePopUpInfo(layerDetails.fields, layerDetails.name) };       renderer.infoWindowRenderer = infoWindowRenderer;       renderer.layerId = layerDetails.id;       renderers.push(renderer);     }   layer.infoWindowRenderers = renderers; }  private function configurePopupInfo(fields:Array, title:String = null):PopUpInfo {   var popUpInfo:PopUpInfo = new PopUpInfo();   if (title)     popUpInfo.title = title;    var popUpFieldInfos:Array = [];    for each (var field:Field in fields)   {     var fieldInfo:PopUpFieldInfo = new PopUpFieldInfo();     fieldInfo.fieldName = field.name;     fieldInfo.label = field.name;     fieldInfo.visible = true;     popUpFieldInfos.push(fieldInfo);   }    popUpInfo.popUpFieldInfos = popUpFieldInfos;    return popUpInfo; }

View solution in original post

0 Kudos
3 Replies
KennyHoran
Regular Contributor
I've been working on adding a default infowindow to all layers and have it working with ArcGISDynamicMapServiceLayer and FeatureLayer. Does your layer have any sub-layers?  If so, you'll need to define an infowindow for each sub-layer and place them all in your arrLayerInfoWindowRenderer.  Here's what I'm doing, perhaps it will help.

// Listen for new layers map.addEventListener(MapEvent.LAYER_ADD, onLayerAdd);  private function onLayerAdd(event:MapEvent):void {   if (event.layer is FeatureLayer)   {     // Do FeatureLayer stuff   }   else if (event.layer is ArcGISDynamicMapServiceLayer)   {     // If it's not a basemap, listen for it to load     var layer:ArcGISDynamicMapServiceLayer = event.layer as ArcGISDynamicMapServiceLayer;     if (layer.name.indexOf(" BaseMap") == -1)       layer.addEventListener(LayerEvent.LOAD, onLayerLoad);   } }  // Fetch the fields of all sub-layers private function onLayerLoad(event:LayerEvent):void {   var layer:ArcGISDynamicMapServiceLayer = event.layer as ArcGISDynamicMapServiceLayer;   layer.removeEventListener(LayerEvent.LOAD, onLayerLoad);   layer.getAllDetails(new AsyncResponser(getAllDetailsResult, getAllDetailsFault, layer)); }  // Build an InfoWindow for each sub-layer private function getAllDetailsResult(event:AllDetails, layer:ArcGISDynamicMapServiceLayer):void {   var renderers:Array = [];   for each (var layerDetails:LayerDetails in event.layerDetails)     if (layerDetails.fields)     {       var renderer:LayerInfoWindowRenderer = new LayerInfoWindowRenderer();       var infoWindowRenderer:ClassFactory = new ClassFactory(PopUpRenderer);       infoWindowRenderer.properties = { popUpInfo: configurePopUpInfo(layerDetails.fields, layerDetails.name) };       renderer.infoWindowRenderer = infoWindowRenderer;       renderer.layerId = layerDetails.id;       renderers.push(renderer);     }   layer.infoWindowRenderers = renderers; }  private function configurePopupInfo(fields:Array, title:String = null):PopUpInfo {   var popUpInfo:PopUpInfo = new PopUpInfo();   if (title)     popUpInfo.title = title;    var popUpFieldInfos:Array = [];    for each (var field:Field in fields)   {     var fieldInfo:PopUpFieldInfo = new PopUpFieldInfo();     fieldInfo.fieldName = field.name;     fieldInfo.label = field.name;     fieldInfo.visible = true;     popUpFieldInfos.push(fieldInfo);   }    popUpInfo.popUpFieldInfos = popUpFieldInfos;    return popUpInfo; }
0 Kudos
JoeJones
Deactivated User
Thanks, that helped me get it to work.
0 Kudos
RhettZufelt
MVP Notable Contributor
Kenny,

saw this post, and have a similar need.

Having some issues trying to figure out what all imports are needed for this.  Any chance you could point me in the right direction?

Thanks,

R_
0 Kudos