I have an application I'm building with version 3.16 of the API. One of the features is the ability to switch between 3 different symbology sets. Each of these 3 is created using the UniqueValueRenderer and updating the FeatureLayer's renderer when a specific option is chosen. Works great.
The problem I'm having is that I want the legend in the application to update when a new renderer is applied, but I haven't been able to figure it out.
I've tried:
app.legend.refresh();
I've also tried writing and calling a function that should destroy any existing legend and create a new one:
function updateLegend(map, fl) {
// destroy previous legend, if present
if ( app.hasOwnProperty("legend") ) {
app.legend.destroy();
domConstruct.destroy(dojo.byId("legend"));
}
// create a new div for the legend
var legendDiv = domConstruct.create("div", {
id: "legend"
}, dom.byId("legendWrapper"));
app.legend = new Legend({
map : map,
layerInfos : [{
layer : fl,
title: 'Stormwater Service Requests'
}]
}, legendDiv);
app.legend.startup();
}
But neither of these updates the legend. In fact, all I get is a message where the legend should be that says "Creating Legend..."
If I have my browser console open, an error is thrown (with both of these options):
Object doesn't support property or method 'replace'
File: 3.16, Line:1715, Column: 514
It looks like the error is being thrown in the API code, not the code for my app. Does anyone have any insight on what this error might be, and what I can do to get the legend to update properly?
Solved! Go to Solution.
I figured this out in case anyone else has this issue. The problem was that I was not setting a 'label' value for each of the UniqueValues in my renderer. It isn't totally obvious, but that 'label' value is required for the legend to display.
It should not be necessary to rebuild the legend every time. Try setting the autoUpdate property to true and run the refresh() after the layer renderer change.
Thanks, but that doesn't change anything.
So the legend works when you initiate the application with any of the 3 symbology sets? And you are not forcing the legend to update before the layer has completely updated the symbology renderer?
Thanks for following up, I figured it out. I wasn't setting the 'label' parameter in the renderer. After adding that, it worked.
I might be wrong, but the legend widget is getting the symbology from the rest, so when you change the symbology in your app, it won't show a change in the legend.
It does, but not if you apply a renderer.
I figured this out in case anyone else has this issue. The problem was that I was not setting a 'label' value for each of the UniqueValues in my renderer. It isn't totally obvious, but that 'label' value is required for the legend to display.