أكثر

لن تعمل الأزرار عندما أنسخ محتوى جدول المحتويات ديناميكيًا في Dojo FloatingPane والعودة

لن تعمل الأزرار عندما أنسخ محتوى جدول المحتويات ديناميكيًا في Dojo FloatingPane والعودة


نحن نعمل مع مجموعة من الإصدار 1.10 من Dojo و ArcGIS JavaScript API 3.11.

سئلنا عما إذا كان من الممكن نسخ قائمة TOC Layerlist إلى Dojo FloatingPane منفصل عن طريق النقر بزر الماوس الأيمن على الخريطة. لا توجد مشكلة حتى الآن. الآن يجب أن أقوم بإدخال زرين يجب أن يكونا

أ. تعطيل كافة الطبقات النشطة

و

ب. فتح جميع الطبقات الفرعية النشطة وإغلاقها.

هذا يعمل كما هو متوقع.

تحدث المشكلة ، عندما أنقر بزر الماوس الأيمن على الخريطة ونسخ محتوى TitlePaneLayerlist في FloatingPane. تم نسخ الأزرار ، تبدو مثل الأزرار ولكن يبدو أنها لم تعد أزرارًا.

هذا هو الرمز الذي نسخ المحتوى:

Registry.byId ("LayerListTP"). مجموعة ("محتوى" ، ريجيستري باي آي دي ("LayerTitlePane"). get ("محتوى")) ؛ Registry.byId ("LayerTitlePane").

LayerListTP هو FloatingPane الجديد ، LayerTitlePane هو الموقع الأصلي لقائمة Layerlist. لأنه لا يمكن أن يكون هناك معرفات مزدوجة قمت بتدمير محتوى LayerTitlePane بعد ذلك.

نسخ المحتوى مرة أخرى إلى جزء العنوان الأصلي يعمل بشكل متطابق ، يتم إفساد الأزرار.

لا يمكنني معرفة من أين تأتي مشكلة الأزرار من سبب عدم نسخها بشكل صحيح.

إليك جميع الكودات الضرورية.

وظيفة لنسخ LayerList

دالة createContextMenuLayer () {تتطلب (["dijit / Menu" ، "dijit / MenuItem" ، "dijit / Registry" ، "dojox / layout / FloatingPane" ، "dojo / _base / window" ، "dojo / _base / array" ، "dojo / dom" ، "dojo / dom-attr" ، "dojo / dom-construct" ، "dojo / dom-style" ، "dojo / on" ، "dojo / query" ، "dojo / sniff" ، "esri / map "،" esri / geometry / Point "]، function (Menu، MenuItem، Registry، FloatingPane، win، array، dom، domAttr، domConstruct، domStyle، on، query، sniff، Map، Point) {var ctxMenuForGraphics، ctxMenuForMap ؛ var currentLocation؛ var ShowLayerList؛ var LayerNotActive = []؛ var RememberLayerNotActiv = []؛ on (map، "MouseUp"، الوظيفة (evt) {if (evt.which === 3) {var LayerListContent = ''؛ إذا (! Registry.byId ("LayerListFloatingPaneId")) {LayerListFloatingPane = new FloatingPane ({id: "LayerListFloatingPaneId"، closeable: true، dockable: false، title: "Karteninhalt"، content: LayerListContent، style: "width: 250px؛ : 250 بكسل ؛ الموضع: مطلق ؛ أعلى: 0 بكسل ؛ يسار: 0 بكسل ؛ "} ، domConstruct.create ('div'، null، map.container))؛ SaveLayerTP = []؛ LayerN otActive = [] ، var inputs = query (". dijitCheckBoxGrouplayer") ، المدخلات ؛ var inputs2 = query (". dijitCheckBoxNonGrouplayer") ، input2 ؛ var GroupedAndNonGroupedLayers = inputs.concat (inputs2) ؛ لـ (var i = 0، il = GroupedAndNonGroupedLayers.length ؛ i nav.clientHeight || nav.scrollHeight> nav.clientHeight && Registry.byId ("LegendTitlePane"). open == true) {domStyle.set (dom.byId ("sliderTocIn")، setIconToRight) ؛ } else {domStyle.set (dom.byId ("sliderTocIn") ، setIconBack) ؛ }}} ، 180) ؛ }) ؛ LayerListFloatingPane.startup () ، LayerListFloatingPane.show () ، // Laden der aktivierten Layer if (SaveLayerTP.length! = 0) {array.forEach (SaveLayerTP، function (LayerNr) {domAttr.set (dom.byId (LayerNr)، "check"، true)؛})؛ Layersvisible = SaveLayerTP ، } if (LayerNotActive! = 0) {array.forEach (LayerNotActive، function (LayerNr) {domAttr.set (dom.byId (LayerNr)، "check"، false)؛})؛ } dynamicMapServiceLayer.setVisibleLayers (Layersvisible) ، // كان passieren soll wenn der FloatingPane geschlossen wird LayerListFloatingPane.close = function () {// eingeblendete Layer speichern RememberLayerklicked = []؛ RememberLayerNotActiv = [] ، var inputs3 = query (". dijitCheckBoxGrouplayer") ، المدخلات ؛ var inputs4 = query (". dijitCheckBoxNonGrouplayer") ، input2 ؛ var GroupedAndNonGroupedLayers2 = المدخلات3.concat (المدخلات 4) ؛ لـ (var i = 0، il = GroupedAndNonGroupedLayers2.length ؛ i nav.clientHeight || nav.scrollHeight> nav.clientHeight && Registry.byId ("LegendTitlePane"). open == true) {domStyle.set (dom.byId ("sliderTocIn")، setIconToRight) ؛ } else {domStyle.set (dom.byId ("sliderTocIn") ، setIconBack) ؛ }} // Inhalt des FloatingPanes zerstören Registry.byId ("LayerListFloatingPaneId"). destructionRecursive ()؛ // Die aktuell aktivierten Layer anschalten if (RememberLayerklicked.length! = 0) {array.forEach (RememberLayerklicked، function (LayerNr) {domAttr.set (dom.byId (LayerNr)، "check"، true)؛})؛ Layersvisible = RememberLayerklicked ؛ } if (RememberLayerNotActiv.length! = 0) {array.forEach (RememberLayerNotActiv، function (LayerNr) {domAttr.set (dom.byId (LayerNr)، "check"، false)؛})؛ } dynamicMapServiceLayer.setVisibleLayers (Layersvisible) ، _isFloatingPaneVisible = خطأ ؛ } ؛ } else {LayerListFloatingPane.startup ()؛ LayerListFloatingPane.show () ، domStyle.set ("LayerListFloatingPaneId"، {position: "absolute"، top: evt.screenPoint.y + "px"، left: evt.screenPoint.x + "px"})؛ }}}) ؛ }) ؛ }

وظيفة لبناء LayerList

function buildLayerList (dynamicMapServiceLayer، ParentLayerVisArray) {تتطلب (["dojo / on"، "dojo / dom"، "dojo / dom-attr"، "dojo / _base / array"، "dojo / request / script"، "dijit / ريجستري "،" dijit / form / Button "]، دالة (on، dom، domAttr، array، script، Registry، Button) {var infos = dynamicMapServiceLayer.layerInfos؛ var info؛ var items = []؛ var subLayerLength = 0 ؛ var preDivName = "DivGroupLayer"؛ var LayerName = ""؛ var GroupLayerInfoId = ""؛ var SetGroupLayerChecked = []؛ var CheckedGroupLayers = []؛ // Dieses Array nimmt die LayerId des Parentlayers auf، dessen Name Array ParentLayerVisAr = []؛ // Dieses Array nimmt die SubLayerIDs auf var SubLayerVisIDs = []؛ // Alle Layer auf nicht sichtbar setzen if (ParentLayerVisArray [0]! = "ALL" || visLayersNumbersFromURL.length> 0) {array.forEach ( infos، function (layerVis) {layerVis.defaultVisibility = false؛})؛} // Beginn | Serviceinformationen auswerten لـ (var i = 0، il = infos.length؛ i 

بعد إجراء المزيد من البحث ، اكتشفت أن هذه هي أفضل طريقة وربما تكون الطريقة الوحيدة لتشغيل الأزرار هي وضعها في لوحة تم مسحها في كل مرة يتم فيها نسخ القائمة في الجزء العائم وتدمير الأزرار وإعدادها مرة أخرى عندما تم إنشاء القائمة في FloatingPane مع جميع التعليمات البرمجية. نفس الوراء.


شاهد الفيديو: ورشة تدريبية حول موقع كلاس دوجو Class dojo