سؤال

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

ثم ذهبت إلى إضافة في تتبع البريد الإلكتروني وظائف.الاشياء القياسية:جديد رسائل البريد الإلكتروني الواردة لها رقم فريد من نوعه تعلق على سطر الموضوع ، اللاحقة كافة رسائل البريد الإلكتروني حول هذه المشكلة يمكن تتبع ببساطة ترك ذلك رقم الهوية في هذا الموضوع عند الرد.لذا لدينا قائمة من المهام المفتوحة ، ولكل منها رقم تعريف كل من هذه المهام ، وقد أمرت قائمة من رسائل البريد الإلكتروني المرتبطة.أريد نص من تلك رسائل البريد الإلكتروني إلى المستخدم كما كانت تبحث في قائمة المهام, لذلك أنا جعلت كل مهمة مربع Dijit "شجرة" التحكم - أعلى مستوى يحتوي على وصف المهمة, تحتوي فروع البريد الإلكتروني وتواريخ واحد "ورقة" من كل من هذه الأغصان يحتوي على نص البريد الإلكتروني.

المشكلة الأولى:أردت عرض الشجرة بالكامل-انهار بشكل افتراضي.بعد البحث جوجل على نطاق واسع جدا ، وجدت عددا من الحلول ، التي يبدو أن تكون صالحة لمدة الإصدارات السابقة من دوجو ولكن ليست واحدة كنت تستخدم.أنا في نهاية المطاف اكتشفت أن أفضل حل من شأنه أن يبدو أن يكون لديك معالج الحدث يسمى عند الشجرة مراقبة تحميلها ببساطة انهار كل فرع/نبات.للأسف, على الرغم من شجرة كانت السيطرة مثيل و "بدء تشغيل" معالج الحدث يسمى الفروع والأوراق لم محملة (البيانات لا يزال يجري تحميلها عبر AJAX الاتصال).لذا تعديل النظام بحيث كل البريد الإلكتروني النص شجرة إضافة هيكل من جانب الخادم.وهذا يعني كله بالكامل بالسكان شجرة التحكم المتوفرة عند بدء التشغيل معالج الحدث يسمى.

لذا بدء التشغيل معالج الحدث بالكامل ينهار الشجرة.التالي, لم أتمكن من العثور على "الصحيح" طريقة لطيفة تنسيق نص البريد الإلكتروني الأوراق.أستطيع أن أضع النص البريد الإلكتروني في ورقة ما يرام, ولكن أي HTML يحصل هرب و يظهر في صفحة ويب.جديلة أكثر التفتيش في جميع أنحاء دوجو الوثائق (يميل إلى أن يكون خارج التاريخ ، مع رمز و الأمثلة ما قبل الإصدارات 1.0) و جوجل.أنا في نهاية المطاف جاء مع الحل من الحصول على جافا سكريبت الذهاب و قراءة SPAN العنصر الذي يوجد في داخل كل ورقة عقدة الأمم المتحدة-الهروب هرب الكود في innerHTML.فكرت في وضع التعليمات البرمجية للقيام بذلك مع كاملا-انهيار--شجرة رمز في شجرة التحكم في بدء تشغيل معالج الحدث.

ومع ذلك...اتضح أن SPAN العنصر ليست في الواقع خلق حتى ينقر المستخدم على expando (الصغير "+" رمز في طريقة عرض شجرة النقر فوق توسيع عقدة).حسنا يا عادل - سأضيف إعادة تنسيق رمز onExpand() معالج الحدث أو أيا كان اسمها.والتي لا يبدو أن هناك.لقد بحثت على الوثائق, لقد بحثت في جوجل...أنا تماما ربما سوء فهم دوجو "نشر/الاشتراك" الحدث التعامل مع النظام ، ولكن أعتقد أن هذا أساسا لأن هناك لا يبدو أن يكون أي وثائق شاملة في أي مكان (مثل أين يمكنني معرفة ما هي الأحداث التي يمكنني الاشتراك فيها؟).

حتى في نهاية المطاف أفضل حل يمكن أن يأتي مع إضافة معالج حدث onClick (وليس "دوجو" الحدث لكن عادي جافا سكريبت حال دوجو لا يعرف شيئا عن) إلى expando عقدة من كل فرع شجرة إعادة صيغ HTML داخل SPAN عنصر من كل ورقة.ما عدا...عندما تسمى SPAN عنصر لا تزال لا توجد (في بعض الأحيان - أوقات أخرى كان مؤقتا فقط إلى مزيد من الخلط بين لكم).ولذلك لدي معالج الحدث إعداد الموقت أن دوري المكالمات وظيفة التحقق لمعرفة ما إذا كان ذات الصلة SPAN عنصر تحولت بعد قبل ثم إعادة تنسيق.

// An event handler called whenever a "email title" tree node is expanded.
function formatTreeNode(nodeID) {
    if (dijit.byId(nodeID).getChildren().length != 0) {
        clearInterval(nodeUpdateIntervalID);
        messageBody = dijit.byId(nodeID).getChildren()[0].labelNode.innerHTML
        if (messageBody.indexOf("<b>Message text:</b>") == -1) {
            messageBody = messageBody.replace(/&gt;/g, ">");
            messageBody = messageBody.replace(/&lt;/g, "<");
            messageBody = messageBody.replace(/&amp;/g, "&");
            dijit.byId(nodeID).getChildren()[0].labelNode.innerHTML = "<b>Message text:</b><div style=\"font-family:courier\">"+messageBody+"</div>";
        }
    }
}

// An event handler called when a tree node has been set up - we changed the default fully-expanded to fully-collapsed.
function setupTree(theTree) {
    dijit.byId("tree-"+theTree).rootNode.collapse();

    messageNode = dijit.byId("tree-"+theTree).rootNode.getChildren();
    for (pl = 0; pl < messageNode.length; pl++) {
        messageNode[pl].collapse();
        messageNode[pl].expandoNode.onclick = eval("nodeUpdateIntervalID = setInterval(\"formatTreeNode('"+messageNode[pl].id+"')\",200); formatTreeNode('"+messageNode[pl].id+"');");
    }
}

سبق له شعور فظيع حقا هاك, و أنا واثق من أنني يجب أن اتخذت منعطفا خاطئا في مكان ما في وقت مبكر في عملية التفكير.هل يمكن أن يخبرني:

  • الطريق الصحيح للذهاب حول وضع جيد تنسيق النص داخل مدرسة/Dijit شجرة التحكم.
  • الطريقة الصحيحة للتعامل مع دوجو الأحداث ، مثل أين يمكنني معرفة ما هي الأحداث التي تتوفر بالنسبة لي الاشتراك.
  • أفضل مكتبة جافا سكريبت لاستخدام (أستطيع أن أفعل ما أريد مع مسج و تجنب كل حول المنازل نهج ينظر إليها أعلاه؟).

PS:إذا كنت تسمية مشروع البرنامج ، فكر اسمها تفرد في جوجل - أنا متأكد البحث عن "دوجو" مستندات جوجل سيكون أسهل دون كل فنون الدفاع عن النفس النتائج في الحصول على الطريق.

PPS:فايرفوكس المدقق الإملائي يعرف كيفية تهجئة "أتوود" ، وتصحيح لي عندما وضعت اثنين 'T بدلا من واحدة.جيف فقط أن شهرة الآن ؟

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

المحلول

أنا افترض أن يتبع dijit.شجرة دوجو.البيانات في دوجو 1.1 البرنامج التعليمي التي وجهت لك لتمرير البيانات إلى شجرة التحكم باستخدام مخزن البيانات.أن كان لي أن أضرب رأسي من جدار من الطوب لفترة من الوقت.

ليس حقا كبيرة النهج البديلة ليست موثقة توثيقا جيدا.تحتاج إلى إنشاء نموذج استخدام بدلا من ذلك.ولقد تضمنت على سبيل المثال تحت شجرة النموذج التي تم إنشاؤها لعرض هيكل دليل LDAP.

سوف تجد الافتراضي تنفيذ نموذج في دوجو التوزيع في ./dijit/_tree/model.js.التعليقات التي ينبغي أن تساعدك على فهم الوظائف المدعومة من نموذج.

على IDirectoryService الطبقة البرمجية أدناه هي بذرة من جانب الخادم جافا POJOs الناتجة عن مباشرة على شبكة الإنترنت عن بعد (DWR).أنا أوصي DWR إذا كنت تنوي أن تفعل الكثير من تفاعل ملقم-عميل.

dojo.declare("LDAPDirectoryTreeModel", [ dijit.tree.model ], {
    getRoot : function(onItem) {
        IDirectoryService.getRoots( function(roots) {
            onItem(roots[0])
        });
    },

    mayHaveChildren : function(item) {
        return true;
    },

    getChildren : function(parentItem, onComplete) {
        IDirectoryService.getChildrenImpl(parentItem, onComplete);
    },

    getIdentity : function(item) {
        return item.dn;
    },

    getLabel : function(item) {
        return item.rdn;
    }
});

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

<div
  dojoType="LDAPDirectoryTreeModel"
  jsid="treeModel"
  id="treeModel">
</div>
<div
  jsid="tree"
  id="tree"
  dojoType="dijit.Tree" model="treeModel"
  labelAttr="name"
  label="${directory.host}:${directory.port}">
</div>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top