I am trying to use this sample to toggle layers: Toggle layer visibility | ArcGIS API for JavaScript but I receive this error message:
"in domReady callback"
"TypeError: Cannot read property 'on' of null
and here is my code:
var visibleLayerIds = [];
on(dom.byId("lyrSigns"), "change", updateLayerVisibility);
on(dom.byId("lyrSupports"), "change", updateLayerVisibility);
function updateLayerVisibility() {
var inputs = query(".list_item");
var inputCount = inputs.length;
for (var i = 0; i < inputCount; i++) {
if (inputs.checked) {
visibleLayerIds.push(inputs.value);
}
}
if (visibleLayerIds.length === 0) {
visibleLayerIds.push(-1);
}
layer.setVisibleLayers(visibleLayerIds);
}And here is my project on github: csergent45/streetSigns · GitHub
Solved! Go to Solution.
I appreciate everyone's help. Thanks to everyone for your help. I clicked like and helpful to give you all points. Here is the final code that I came up with:
on(dom.byId("lyrSigns"), "change", updateSignLayerVisibility);
on(dom.byId("lyrSupports"), "change", updateSupportLayerVisibility);
function updateSignLayerVisibility() {
if (document.getElementById('lyrSigns').checked) {
app.signLayer.setVisibility(true);
} else {
app.signLayer.setVisibility(false);
}
}
function updateSupportLayerVisibility() {
if (document.getElementById('lyrSupports').checked) {
app.supportLayer.setVisibility(true);
} else {
app.supportLayer.setVisibility(false);
}
}I was hoping for a single loop, but this works.
Chris,
Seems like you could lessen your code a little by doing this:
on(dom.byId("lyrSigns"), "change", updateLayerVisibility);
on(dom.byId("lyrSupports"), "change", updateLayerVisibility);
function updateLayerVisibility() {
if (document.getElementById('lyrSigns').checked) {
app.signLayer.setVisibility(true);
} else {
app.signLayer.setVisibility(false);
}
if (document.getElementById('lyrSupports').checked) {
app.supportLayer.setVisibility(true);
} else {
app.supportLayer.setVisibility(false);
}
}
Awesome! That worked nicely.
Chris,
Even better:
on(dom.byId("lyrSigns"), "change", updateLayerVisibility);
on(dom.byId("lyrSupports"), "change", updateLayerVisibility);
function updateLayerVisibility() {
app.signLayer.setVisibility(document.getElementById('lyrSigns').checked);
app.supportLayer.setVisibility(document.getElementById('lyrSupports').checked);
}
Very nice. So this is setting visibility based on the value of checked. Is that correct?
Correct
Hi Robert,
I tried using your code but I get an error that "0x800a1391 - JavaScript runtime error: 'on' is undefined" However i defined "on" in my default file like this " dojo.require("dojo/on");"
Should I declare it differently? Thanks!
Liana,
Normally you would just add dojo/on to your main requires in your app but if you do a separate require then your code that uses dojo on has to be inside the requires function.
require(["dojo/on"], function(on){
//Now you can use "on"
});
Your input's id is actually lyrSupport but you're looking for lyrSupports.
In index.html:
| <input type="checkbox" id="lyrSupport" checked value="1" /> Supports |
Change lyrSupport to lyrSupports.
I just replied to your other post and then saw this one. Here was my response:
I checked out your toggle layer code and the code that you pulled from is using DynamicMapService found here Toggle layer visibility | ArcGIS API for JavaScript
In your application you are using feature layers. I am using feature layers and toggling like this:
- var layer1 = new FeatureLayer("https://myurl/MapServer/1",{
- mode: FeatureLayer.MODE_ONDEMAND,
- outFields: ["*"],
- infoTemplate: template
- });
- var checkBox = new CheckBox({
- name: "checkBox1",
- value: "agreed",
- checked: false,
- onChange: function(b){
- if (b == true) {
- map.addLayer(layer1);
- } else {
- map.removeLayer(layer1);
- } }
- }, "checkBox1").startup();
Be sure to call the "dijit/form/CheckBox", module with function(CheckBox)
<input type='checkbox' id='checkBox1' value=1 />Layer1<br />Hope this helps you out with that issue.
Steven