سؤال

أنا أستخدم Dynatree من JQuery في طلبي وأريد تحديد جميع العقد الفرعية برمجيًا عند تحديد عقدة الوالدين. هيكل شجرتي كما يلي

<div id = "tree">
    <ul>
       <li>package 1
         <ul>
           <li>module 1.1
              <ul>
                <li> document 1.1.1</li>
                <li> document 1.1.2</li>
               </ul>
            </li>  
            <li>module 1.2
               <ul>
                 <li>document 1.2.1</li>
                 <li>document 1.2.2</li>
               </ul>
           </li>
        </ul>
     </li>
     <li> package 2
        <ul>
          <li> module 2.1
            <ul>
               <li>document 2.1.1</li>
               <li>document 2.1.1</li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
</div> 

الآن ما أريده هو أنه عندما أنقر على عقدة الشجرة مع العنوان "الحزمة 1" جميع العقد الفرعية IE (الوحدة 1.1 ، المستند 1.1.1 ، المستند 1.1.2 ، الوحدة 1.2 ، المستند 1.2.1 ، المستند 1.2.2) يجب أيضًا اختيارها.

فيما يلي النهج الذي حاولت استخدامه:

$("#tree").dynatree({
        onSelect: function(flag, dtnode) {
            // This will happen each time a check box is selected/deselected
            var selectedNodes = dtnode.tree.getSelectedNodes();
            var selectedKeys = $.map(selectedNodes, function(node) {

                //alert(node.data.key);
                return node.data.key;


            });
            // Set the hidden input field's value to the selected items
            $('#SelectedItems').val(selectedKeys.join(","));

            if (flag) {
                child = dtnode.childList;

                alert(child.length);
                for (i = 0; i < child.length; i++) {
                    var x = child[i].select(true);
                    alert(i);
                 }
            }
        },
        checkbox: true,
        onActivate: function(dtnode) {
            //alert("You activated " + dtnode.data.key);
        }


    });

في ال if(flag) الشرط أحصل على جميع العقد الفرعية للعنصر الذي يتم تحديده من قبل المستخدم ويعطيني القيمة الصحيحة التي يمكنني رؤيتها من عبارة ALERT (child.length). ثم أقوم بتشغيل الحلقة لتحديد جميع الأطفال ولكن الحلقة لا تتجاوز البيان أبدًا var x = child[i].select(true);

ولا يمكنني رؤية البيان أبدًا alert(i) يجري تنفيذها. نتيجة البيان أعلاه هي أنه إذا قمت بتحديد الحزمة 1 ، يتم اختيار الوحدة 1.1 والوثيقة 1.1.1 ولكنها لا تنفذ أبدًا alert(i) بيان - لا يتم اختيار أي أطفال آخرون من الحزمة 1. في رأيي عندما لأول مرة child[i].select(true) يتم تنفيذ البيان ، كما أنه يؤدي إلى حدث محدد لأطفاله وبالتالي جعل شيء من العودية

هل تفكيري صحيح؟ بغض النظر عن العودية أو ما يفعله على الأرض ، فإنه لا يكمل الحلقة وينفذ التعليمات التالية للغاية alert(i).

الرجاء مساعدتي في حل هذه المشكلة. أنا أموت لأرى هذا التنبيه ، وأي اقتراح ومساعدة موضع تقدير كبير.

هل كانت مفيدة؟

المحلول

بالكاد تم اختباره ، لكن يمكنك تجربة شيء مثل هذا:

$(function(){
    var inEventHandler = false;
    $("#tree").dynatree({
        checkbox: true,
        selectMode: 2,
        [...]
        onSelect: function(select, dtnode) {
            // Ignore, if this is a recursive call
            if(inEventHandler) 
                return;
            // Select all children of currently selected node
            try {
                inEventHandler = true;
                dtnode.visit(function(childNode){
                    childNode.select(true);
                });
            } finally {
                inEventHandler = false;
            }
        }

نصائح أخرى

على الرغم من كونك غير خبير في القدرات الداخلية لـ Dynatree ، إلا أنني كتبت بعض التعليمات البرمجية التي تولد فتات الخبز للعقدة التي تم النقر عليها وجميع أحفادها.

في المثال أدناه ، سيتم إخراج النقر على "Edibles":

edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes

أثناء النقر على "التفاح الخضراء" سوف يخرج:

edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith

يمكنك استلهام هذا المثال واسترداد الحقول التي تحتاجها من جميع مستندات الأطفال وإنشاء خرج HTML الخاص بك.

الكود في هذا الموضوع:أفضل طريقة لإنشاء فتات نصية من صفيف PHP لها 3 أعمدة (معرف ، مسار ، الاسم)؟

يسمى البرنامج النصي PHP نفسه من معالج أحداث Dynatree من خلال jQuery.ajax({...}); استفسار.

استخدم الوظيفة التالية بدلاً من واحد من MAR10 إجابه.

يتم اختيار جميع العقد الفرعية/غير محدد على Node Monity Select/unlect.

onSelect: function (isSelected, node) {
    node.visit(function (childNode) {
        childNode.select(isSelected);
    });
},
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top