Один слой отображается в виджете LayerList (ArcGIS JavaScript)

Можно ли отображать на карте один слой в этом руководстве ESRI Виджет LayerList?

Каждый раз, когда вы нажимаете на слой, предыдущий должен деактивироваться. Таким образом, у вас всегда будет только один слой на карте.

Мишель

введите здесь описание изображения


person Michelle    schedule 17.04.2017    source источник
comment
Нужно переопределить виджет списка слоев... Позвольте мне проверить код..   -  person Vikash Pandey    schedule 17.04.2017
comment
Слои взяты из одного картографического сервиса или из нескольких? если вы можете предоставить код, я мог бы помочь   -  person Ashraf    schedule 22.04.2017
comment
Привет @Ahraf Я хотел бы использовать код из учебника ESRI, упомянутого выше. Карта основана на идентификаторе веб-карты ArcGIS Online.   -  person Michelle    schedule 23.04.2017


Ответы (2)


Мне удалось написать код для вас. Проверьте это и дайте мне знать:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
<title>Layer List Dijit</title>
<link rel="stylesheet" href="https://js.arcgis.com/3.20/dijit/themes/claro/claro.css">
<link rel="stylesheet" href="https://js.arcgis.com/3.20/esri/css/esri.css">
<script language="javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<style>
html, body, .container, #map {
height:100%;
width:100%;
margin:0;
padding:0;
margin:0;
font-family: "Open Sans";
}
#map {
padding:0;
}
#layerListPane{
width:25%;
}
.esriLayer{
  background-color: #fff;
}
.esriLayerList .esriList{
    border-top:none;
}
.esriLayerList .esriTitle {
  background-color: #fff;
  border-bottom:none;
}
.esriLayerList .esriList ul{
  background-color: #fff;
}

</style>
<script>var dojoConfig = { parseOnLoad: true };var busy=false;</script>
<script src="https://js.arcgis.com/3.20/"></script>
<script>
require([
"esri/arcgis/utils",
"esri/dijit/LayerList",
"dijit/layout/BorderContainer",
"dijit/layout/ContentPane",
"dojo/domReady!"
], function(
arcgisUtils,
LayerList
) {
//Create a map based on an ArcGIS Online web map id
arcgisUtils.createMap("f63fed3f87fc488489e27c026fa5d434", "map").then(function(response){
    var myWidget = new LayerList({
       map: response.map,
       layers: arcgisUtils.getLayerList(response)
    },"layerList");

    myWidget.on("toggle",function(evt){
        if(busy) return;

        selectedLayerSubIndex = evt.subLayerIndex;
        if(selectedLayerSubIndex) return;

        selectedLayerIndex = evt.layerIndex;
        visibility = evt.visible;

        elm = $("#layerListPane input[type=checkbox][data-layer-index="+selectedLayerIndex+"]:not([data-sublayer-index])");


        otherCheckedElems = $("#layerListPane input[type=checkbox][data-layer-index!="+selectedLayerIndex+"]:not([data-sublayer-index]):checked");
        if(visibility){
            busy=true;
            otherCheckedElems.each(function () {
                $(this).click();
            });
            busy=false;
        }
        else{
            checkedLength = otherCheckedElems.length
            if(checkedLength==0) setTimeout("elm.click();", 100);
        }
    })

    myWidget.startup();
});

});
</script>
</head>
<body class="claro">
<div class="container" data-dojo-type="dijit/layout/BorderContainer"
data-dojo-props="design:'headline',gutters:false">
<div id="layerListPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
    <div id="layerList"></div>
</div>
<div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'"></div>
</div>
</body>
</html>
person Ashraf    schedule 23.04.2017
comment
Прекрасный. Только начал учиться программировать, очень полезно для меня. Можно ли всегда иметь один слой на карте (как указано в вопросе)? На этом этапе вы можете деактивировать слой и оставить его на карте; можно ли предотвратить такое поведение? - person Michelle; 24.04.2017
comment
Изначально вы получите слои по мере их видимости в картографическом сервисе. Так ты хочешь переопределить это? вы можете, например, включить только первый слой. Если это был ваш вопрос, пожалуйста, дайте мне знать, чтобы я обновил код. И наверняка вы можете оставить хотя бы один слой включенным. Обновлю ответ позже после подтверждения вашего вопроса. - person Ashraf; 24.04.2017
comment
Привет @Ashraf Я не хочу переопределять первоначальную видимость из картографического сервиса. Выбирая слой из списка, в этот момент вы также можете снять с него выделение и остаться без слоев на карте. Я хотел бы предотвратить такое поведение, чтобы у вас всегда был один слой. - person Michelle; 24.04.2017
comment
Привет @Ashraf Не уверен, что это работает, щелкнув имя слоя, вы можете отменить его выбор и остаться без слоев на карте :( - person Michelle; 25.04.2017
comment
@Мишель, нажав на флажки, работает. Но нажатие ярлыков не работает. ты прав . Изменит код и обновит вас. - person Ashraf; 25.04.2017
comment
@Michelle Я пошел дальше и изменил код для вас. Также я опубликовал здесь копию, чтобы увидеть ее в действии: jsbin.com/xanepazodo/edit?html, вывод - person Ashraf; 26.04.2017
comment
Привет @Ahraf Код работает отлично, спасибо за ваше время :) - person Michelle; 26.04.2017
comment
Я ищу точно такую ​​​​же функциональность в 4.x, я могу немного заставить ее работать, но у нее были некоторые проблемы 1) нужно дважды щелкнуть значок глаза при переключении, например: щелкните слой 1, а затем щелкните слой 2 это было просто снятие отметки со слоя 1, я ищу функциональность переключателя 2) текущий переключатель применяется как для слоя, так и для подслоев, я ищу переключатель только для верхних слоев, подслои должны просто работать как флажок. Не могли бы вы проверить мою скрипку ниже? jsfiddle.net/skesani/3jacqf0p - person angular_architect; 23.05.2021

Обновленный ответ с версией 4 API. Можно добавить функционал при создании виджета используя 2 возможности.

Функция listItemCreatedFunction-

https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-LayerList.html#listItemCreatedFunction

Согласно апи:

Указывает функцию, которая обращается к каждому ListItem. Каждый элемент списка может быть изменен в соответствии с его изменяемыми свойствами. Действия можно добавлять к элементам списка с помощью свойства actionSections элемента ListItem.

и свойство OperationItems-

https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-LayerList.html#operationalItems

Согласно апи:

Коллекция ListItems, представляющих операционные слои.

var LayerListWidget = new LayerList({
      listItemCreatedFunction: (event) => {
        var itemView = event.item; // layer-view of selection
        itemView.watch("visible", (event) => {
          LayerListWidget.operationalItems.forEach((layerView) => {
            if (layerView.layer.id != itemView.layer.id) {
              layerView.visible = false;
            }
          });
        });
      },
      view: view,
    });
person Shaked    schedule 21.07.2020
comment
Ваш единственный ответ, который я нашел, связанный с версией 4.X, я считаю его очень полезным, но у переключения есть некоторые проблемы, 1) нужно дважды щелкнуть значок глаза при переключении, например: щелчок слоя 1 и когда щелчок по слою 2 я просто снял флажок со слоя 1, я ищу функциональность переключателя 2) текущий переключатель применяется как для слоя, так и для подслоев, я ищу переключатель только для верхних слоев, подслои должны просто работать как флажок. Не могли бы вы проверить мою скрипку ниже? jsfiddle.net/skesani/3jacqf0p - person angular_architect; 23.05.2021
comment
Привет, @angular_architect, ты был прав насчет возникших проблем. Функция listItemCreatedFunction немного сложна, поэтому я выбрал другой подход, который справился бы с этой задачей. Я не хотел драться с ним просто так. Надеюсь, это поможет вам https://jsfiddle.net/wgoemp5x/2/ - person Shaked; 24.05.2021