يقدم هذا المقال أفكاري الأخيرة للتنفيذ لوظائف متتالية مماثلة في شلالات المقاطعات والبلدية. من أجل فصل المسؤوليات والأداء والسلوك قدر الإمكان ، يتم تقسيم هذه الوظيفة إلى مكونين ويتم استخدام قائمة مرتبطة واحدة لتنفيذ منطق سلسلة المفاتيح. القسم التالي له تأثير عرضي. على الرغم من أن هذه وظيفة شائعة جدًا ، إلا أن منطق تنفيذ هذه المقالة واضح ويسهل فهم الرمز. يتم فصله عن دلالات الشلالات في المقاطعات والبلدية ، ويأخذ في الاعتبار فصل الأداء والسلوك. آمل أن يحصل محتوى هذه المقالة على بعض القيمة المرجعية لعملك. مرحبا بكم في قراءة وتصحيح ذلك.
عملية سلسلة
Cascadetype. استمر عملية الثبات (باستثناء)
Cascadetype. دمج عملية تحديث Cascade (MERGY)
Cascadetype. قم بتحديث عملية تحديث Cascade ، والاستعلام فقط واحصل على العمليات
Cascadetype. قم بإزالة عملية حذف Cascade
Cascadetype. جميع سلسلة جميع العمليات أعلاه
سواء كان ذلك لتأخير تحميل الزحف الجلب ، فإن الافتراضي هو أن الجانب الأول يتم تحميله على الفور ، وكلما زاد التحميل على الجانب
صيانة العلاقة Medpedby
medbyby = "parentid" تعني أن السمة الوالدة في فئة الأطفال تستخدم للحفاظ على العلاقة. يجب أن يكون هذا الاسم هو نفس اسم السمة ParentID في فئة الأطفال.
أيضًا ، تجدر الإشارة إلى أن نوع المجموعة في الفئة الأصل يجب أن يكون قائمة أو تعيين ، ولا يمكن ضبطه على ArrayList ، وإلا سيتم الإبلاغ عن خطأ
تأثير العرض التوضيحي (تنزيل الكود ، ملاحظة: يتطلب هذا التأثير تشغيل HTTP. بالإضافة إلى ذلك ، فإن البيانات الموجودة في التأثير هي بيانات محاكاة ولا يتم إرجاعها بالفعل بواسطة الخلفية ، وبالتالي فإن البيانات المنسدلة للمقاطعات والمدن والمقاطعات التي تراها هي نفسها):
ملاحظة: تستخدم هذه المقالة التنفيذ الفني للمدونات السابقة ذات الصلة. إذا كنت في حاجة إليها ، يمكنك النقر فوق الرابط أدناه لمعرفة ذلك:
1) شرح مفصل لتنفيذ الميراث لـ JavaScript: توفير class.js لتحديد علاقة الميراث بين فئة JavaScript وفئة البناء ؛
2) مهارات jQuery لجعل أي مكون من مكونات إدارة الأحداث يشبه DOM: توفير eventbase.js لتزويد أي مثيل مكون مع وظائف إدارة الأحداث الشبيهة DOM ؛
3) التغليف الثانوي لمكونات Ajax و Ajax Cache Cache: Ajaxcache: يوفر Ajax.js و Ajaxcache.js ، يبسط مكالمات Ajax من jQuery ، وكيل ذاكرة التخزين المؤقت لطلبات العميل.
دعونا أولاً نتعرف على المزيد حول متطلبات هذه الوظيفة.
1. التحليل الوظيفي
يتم توضيح هذه الوظيفة من خلال مكون متتالي يحتوي على ثلاثة عناصر متتالية:
1) قد يتطلب كل عنصر متتالي خيارًا لاستخدامه كموجه إدخال:
في هذه الحالة ، يمكن تحديد خيار فارغ في قائمة بيانات كل عنصر متتالي (أي ، الخيار الذي دفعه الإدخال):
قد لا يكون من الضروري أيضًا استخدام مطالبات الإدخال:
في هذه الحالة ، يمكن تحديد خيار البيانات فقط في قائمة بيانات كل عنصر متتالي ، ولا يمكن تحديد أي خيار فارغ:
2) إذا كانت الصفحة الحالية تستفسر من قاعدة البيانات والحقول المقابلة لمكون متتالي لها قيم ، فسيتم صدى القيمة المستعف على مكون متتالي:
إذا لم يكن للحقل المقابل الموجود في الاستعلام أي قيمة ، فسيتم عرض الحالتين الموصوفتين في متطلبات النقطة 1).
3) يشكل كل عنصر متتالي علاقة قائمة واحدة مرتبطة في بنية البيانات. ترتبط قائمة بيانات العنصر المتتالي الأخير بالبيانات التي تم تحديدها بواسطة عنصر متتالي سابق.
4) بالنظر إلى مشكلات الأداء ، يتم عرض قائمة بيانات كل عنصر متتالي بشكل غير متزامن بواسطة AJAX.
5) بعد اكتمال تهيئة المكون المتتالي ، يتم تحميل قائمة العنصر المتتالي الأول تلقائيًا.
6) عندما يتغير العنصر المتتالي الحالي ، قم بمسح قائمة بيانات جميع العناصر المتتالية المرتبطة بشكل مباشر أو غير مباشر. في الوقت نفسه ، إذا لم تكن القيمة بعد العنصر المتتالي السابق فارغًا ، فسيتم تحميل قائمة بيانات العنصر المتتالي التالي الذي يرتبط بشكل مباشر به تلقائيًا. عند مسح قائمة بيانات العناصر المتتالية ، كن حذرًا: إذا كانت العناصر المتتالية بحاجة إلى عرض خيار موجه الإدخال ، فيجب الاحتفاظ بالخيار عند المقاصة.
7) يجب أن ننظر بشكل كامل في مشكلات الأداء وتجنب التحميل المكررة.
8) بالنظر إلى مسألة تقديم النموذج ، عند تغيير أي عنصر متتالي من مكون المتتالي ، يجب أن تنعكس القيمة المحددة من قبل مكون متتالي في حقل نص مخفي ، وذلك لتسهيل تقديم قيمة مكون متتالي إلى الخلفية من خلال حقل النص.
الوظيفة تقريبا على النحو الوارد أعلاه.
2. أفكار التنفيذ
1) بنية البيانات
ما يختلف عن المكونات الأخرى هو أن لديها بعض التبعيات مع البيانات في الخلفية. بنية البيانات التي أعتبرها يتم تنفيذها بشكل أفضل:
{"id": 1 ، "text": "Beijing" ، "Code": 110000 ، "ParentId: 0} ، {" id ": 2 ،" text ":المعرف هو المعرف الفريد للبيانات ، ويتم إنشاء علاقة الارتباط بين البيانات من خلال ParentId. النص والرمز كلها مجالات أعمال عادية. إذا اتبعنا بنية البيانات هذه ، فسيكون من السهل جدًا الاستعلام عن واجهة قائمة البيانات المتتالية:
// تحقق من قائمة العنصر الأول/api/cascade؟ parentId = 0 // تحقق من قائمة عنصر cascade الثاني بناءً على القيمة المحددة بواسطة عنصر cascade الأول/api/cascade؟ parentid = 1 //
من السهل أيضًا التعامل مع هذا الهيكل للخلفية. على الرغم من أنها هيكل طاولة على شكل شجرة من الناحية الهيكلية ، إلا أن الاستعلامات مقروءة جميعها ، بحيث يسهل تنفيذها.
يمكن ملاحظة أيضًا من مظاهرة الاستعلام السابقة أن هذا الهيكل يمكن أن يساعدنا في توحيد الواجهة ومعلمات استعلام البيانات إلى واحد ، وهو أمر مناسب للغاية لتطوير المكون. بعد أن نحصل على بنية البيانات هذه من الخلفية ، نقوم بتحليل كل بيانات في خيار ، مثل <Option Value = "beijing"-value-value = "1"> beijing </soph>. لا يمكن أن يكمل هذا العرض المنسدلة فقط لقائمة البيانات ، ولكن أيضًا جمع القيمة المحددة لعنصر Cascade الحالي من خلال وظيفة عنصر تحديد النموذج. أخيرًا ، عندما يتغير عنصر Cascade ، يمكننا أيضًا الحصول على الخيار المحدد ، واستخدام قيمة قيمة البيانات المخزنة عليها كمعلمة ParentID لتحميل قائمة عنصر Cascade التالي. هذه هي أيضًا فكرة استعلام بيانات المكونات المتتالية.
ومع ذلك ، ما يجب مراعاته هنا هو مسألة المرونة. في المشاريع الفعلية ، يمكن تعريف هياكل البيانات الخاصة بمكونات متتالية وفقًا لعلاقة ارتباط مماثلة مثل ID ParentId ، ولكن لا تسمى حقولها بالضرورة رمز النص الوالدي للمعرف ، ومن المحتمل أن تكون حقول أخرى. بمعنى آخر: عند تحليل البيانات في خيار ما ، فإن الحقل المستخدم لنص الخيار والقيمة ، وقيمة الحقل المستخدمة في سمة قيمة البيانات غير مؤكدة ؛ لا يمكن أن يموت اسم المعلمة ParentId عند الاستعلام عن البيانات. في بعض الأحيان ، إذا كتب موظفو الواجهة الخلفية واجهة الاستعلام أولاً ويستخدم اسمًا آخر ، فلا يمكنك أن تطلب من شخص ما تغيير اسم المعلمة الخاص به ، لأنه يحتاج إلى تجميعه ونشره ، وهو أمر أكثر إزعاجًا من الواجهة الأمامية ؛ لا يمكن إصلاح قيمة ParentId = 0 ، لأن الوالدين للطبقة الأولى من البيانات في المشروع الفعلي قد يكون فارغًا أو -1. يجب تصميم هذه الأشياء كخيارات. من ناحية ، يتم توفير القيمة الافتراضية ، ويتم حجز الإعداد الخارجي أيضًا وفقًا للوضع الفعلي. على سبيل المثال ، في التنفيذ النهائي لهذه المقالة ، يتم تعريف هذا الخيار مثل هذا:
Textfield: "Text" ، // اسم الحقل في البيانات التي تم إرجاعها ليتم عرضها في عنصر <Spoint>
ValueField: "Text" ، // اسم الحقل في البيانات التي تم إرجاعها ليتم تعيينها على قيمة عنصر <Potion>
Paramfield: 'id' ، // عند الاتصال بواجهة استعلام البيانات ، اسم الحقل المقابل للبيانات المراد تمريرها إلى الخلفية
ParamName: 'parentid' ، // عند الاتصال بواجهة استعلام البيانات ، يتم تمرير اسم المعلمة للبيانات بعد عنوان URL
DefaultParam: '' ، // عند الاستعلام عن عنصر سلسلة أول ، يتم تمرير القيمة إلى الخلفية عمومًا 0 أو '' أو -1 ، وما إلى ذلك ، مما يشير إلى أن البيانات الموجودة في الطبقة العليا يجب الاستعلام عنها
2) هيكل HTML
وفقًا للمادة 1 من التحليل الوظيفي السابق ، هناك نوعان من هياكل HTML الأولية لمكونات متتالية:
<ul id = "licenselocation-view"> <li> <select> <option value = ""> الرجاء تحديد مقاطعة </option> </select> </li> <li> <list> <septor
أو
<ul id = "companylocation-view"> <li> <select> </select> </li> <li> <live> </select> </li> <li> <li> <select> </select> </li> </ul>
الفرق الوحيد بين هذين الهيكلين هو ما إذا كان الخيار المستخدم كطالب الإدخال قد تم تكوينه. تجدر الإشارة أيضًا إلى أنه في حالة الحاجة إلى هذا الخيار الفارغ ، يجب تعيين سمة القيمة على فارغة ، وإلا فإن هذا الخيار الفارغ سيقوم بإرسال معلومات مطالبة الخيار إلى الخلفية عند إرسال النموذج.
أهم شيء في هذين الهيكلين هو العنصر المختار ، الذي لا علاقة له بـ UL و LI. تستخدم UL و LI لواجهة المستخدم. لا يحتوي العنصر المختار على دلالات ، وليس هناك حاجة لتحديد المقاطعة ، وهي مدينة ، وهي منطقة أو مقاطعة. من الناحية الوظيفية ، يمثل الاختيار عنصرًا متتاليًا. لا يهم أين يتم تعريف هذه الاختيار. نحتاج فقط إلى إخبار المكون المتتالي الذي يختار العناصر التي تتكون من العناصر المتتالية. الشيء الوحيد الذي يجب إخباره بالمكون هو تسلسل هذه العناصر المحددة ، ولكن عادة ما يتم التحكم في ذلك من خلال الترتيب الافتراضي للعناصر في HTML. يمكن أن يساعدنا هذا الهيكل في فصل وظائف المكونات عن السلوك قدر الإمكان.
3) فصل المسؤوليات واستخدام قوائم واحدة مرتبطة
يمكن أن نرى من الجزء السابق أنه إذا تم تقسيم هذا المكون المتتالي وفقًا للمسؤوليات ، فيمكن تقسيمه إلى مكونين أساسيين ، والآخر مسؤول عن إدارة الوظائف الشاملة وعناصر التتالي الداخلية (Cascadeview) ، والآخر مسؤول عن التنفيذ الوظيفي لمصاعد Cascade (CascAdeItem). بالإضافة إلى ذلك ، من أجل تنفيذ منطق متتالي بشكل أكثر ملاءمة ، نحتاج فقط إلى توصيل جميع العناصر المتتالية من خلال قائمة مرتبطة. من خلال وضع النشر-subscribe ، يشترك العنصر المتتالي الأخير في الرسالة التي تفيد بأن العنصر المتتالي السابق قد تغير ؛ عندما يتغير العنصر المتتالي الحالي ، يتم نشر رسالة لإخطار العنصر المتتالي اللاحق لمعالجة المنطق ذي الصلة ؛ من خلال دور القائمة المرتبطة ، قد يتم تمرير هذه الرسالة حتى آخر عنصر متتالي. إذا وصفتها في صورة ، فسيكون الأمر هكذا تقريبًا:
كل ما نحتاج إلى فعله هو التحكم في إصدار الأخبار الجيدة وتسليمها.
4) نموذج التقديم
من أجل تقديم قيمة مكون متتالي إلى الخلفية بشكل مريح ، يمكن التعامل مع المكون المتتالي بالكامل ككل ، ويتم توفير حدث محدد إلى الخارج ، يمكن من خلاله الحصول على قيم جميع العناصر المتتالية. نظرًا لوجود العديد من المتتاليين ، عند نشر الحدث على onChanged ، لا يمكن تشغيل هذا الحدث إلا عندما يتغير أي سلسلة.
5) AJAX ذاكرة التخزين المؤقت
في هذا المكون ، نحتاج إلى النظر في مستويين من ذاكرة التخزين المؤقت Ajax. الأول هو على مستوى المكون. على سبيل المثال ، قمت بتبديل أول عنصر Cascade إلى Beijing. في هذا الوقت ، قام عنصر التتالي الثاني بتحميل بيانات بكين. ثم قمت بتبديل أول عنصر متتالي من بكين إلى hebei ثم إلى بكين. في هذا الوقت ، لا يزال عنصر Cascade الثاني يعرض قائمة البيانات المرتبطة بـ Beijing. إذا قمنا بتخطيط بياناتها عند تحميل القائمة لأول مرة ، فلن نحتاج إلى بدء طلب Ajax هذه المرة ؛ والثاني هو طلب AJAX. على المستوى ، إذا كان هناك مكونات متعددة متتالية على الصفحة ، فأنا أولاً تبديل العنصر المتتالي الأول من المكون المتتالي الأول إلى بكين ، ويبدأ المتصفح طلبًا من AJAX لتحميل البيانات. عندما أقوم بتبديل العنصر المتتالي الأول من المكون المتتالي الثاني إلى بكين ، سيرسل المتصفح طلبًا آخر لتحميل البيانات. إذا قمت بتخزين البيانات التي تم إرجاعها بواسطة طلب AJAX الأول للمكون الأول أولاً ، عندما يستخدم المكون الثاني نفس المعلمات لطلب الواجهة نفسها ، فسيستخدم مباشرة ذاكرة التخزين المؤقت السابقة لإرجاع النتيجة ، والتي يمكن أن تقلل أيضًا من طلب AJAX. يعتمد المستوى الثاني من ذاكرة التخزين المؤقت AJAX على ما ورد أعلاه "التغليف الثانوي لـ JQuery Ajax و Ajax Cache Proxy Component: Ajaxcache". بالنسبة للمكون ، فإنه ينفذ فقط المستوى الأول من ذاكرة التخزين المؤقت داخليًا ، ولكنه لا يحتاج إلى النظر في المستوى الثاني من ذاكرة التخزين المؤقت ، لأن تنفيذ ذاكرة التخزين المؤقت للمستوى الثاني شفاف ، ولا يعلم أن مكون AJAX الذي يستخدمه له وظيفة ذاكرة التخزين المؤقت.
3. تفاصيل التنفيذ
يتضمن التنفيذ النهائي ثلاثة مكونات ، Cascadeview و CascAdeItem و CascadepublicDefaults. الأولان هما جوهر المكون ، ويستخدم الأخير فقط لتحديد بعض الخيارات. تم وصف وظيفتها بالتفصيل في تعليقات CascAdeItem. بالإضافة إلى ذلك ، هناك تعليقات مفصلة للغاية في الكود التالي تشرح دور بعض الرموز الرئيسية. بالنظر إلى الرمز بناءً على المتطلبات السابقة ، يجب أن يكون من السهل نسبيًا فهمه. اعتدت على استخدام النص لشرح بعض تفاصيل التنفيذ ، لكن في وقت لاحق شعرت تدريجياً أن هذه الطريقة كانت بلا شكر بعض الشيء. أولاً ، لم يكن من السهل تنظيم اللغة على مستوى التفاصيل. في بعض الأحيان لم أعرب عن معاني. من الواضح أنني أردت أن أشرح شيئًا بوضوح ، لكن اتضح أنه أكثر حيرة. على الأقل سأشعر بهذه الطريقة عندما قرأت ما كتبته. ثانياً ، يتمتع المطورين أنفسهم بالقدرة على قراءة رمز المصدر ، ومعظم المطورين نشاطًا على استعداد لفهم أفكار التنفيذ من خلال التفكير في رمز الآخرين ؛ لذلك استخدمت التعليق التوضيحي لشرح تفاصيل التنفيذ بدلاً من ذلك :)
CascadepublicDefaults:
DEFINE (function () {return {url: '' ، // // Quary Interfious Field: 'text' ، // return data fore faluefield: 'text' ، من بين البيانات التي سيتم نقلها إلى الخلفية ، يكون اسم paramname: "ParentId" ، // عند استدعاء واجهة استعلام البيانات ، اسم المعلمة للبيانات التي تمر بعد عنوان URL هو الافتراضي: '' ، // عند الاستعلام عن العنصر المتتالي الأول ، يتم تمرير القيمة الأولى (expirt) كطالب إدخال ، مثل: يرجى تحديد مقاطعة) ، إذا كان ذلك صحيحًا ، فلن يتم مسح الخيار الافتراضي FirstResolveAjax عند إعادة تحميل عنصر سلسلة: الوظيفة (الدقة) {return res ؛} // لأن عنصر التتالي سيرسل طلبًا غير متزامن عند تحميل البيانات ، يتم استخدام هذا الاتصال لتحليل الاستجابة التي تم إرجاعها بواسطة طلب Asynchron}) ؛Cascadeview:
define (function (require ، orports ، module) {var $ = require ('jQuery') ؛ var class = require ('mod/class') ؛ var eventbase = require ('mod/eventbase') ؛ var publicdefaults = require ('mod/cascadepublicdefs') ؛ var cascadeitem = 'mod/cascadeem') ؛ CascAdeItem Component*/var defaults = $ .Extend ({} ، publicdefaults ، {$ عناصر: غير محدد ، // صفيف من كائنات jq العنصر المتتالي ، فإن ترتيب العناصر في البيانات يمثل ترتيبًا من القيمة المتقدمة: City ، District ، chaoyang District القيم: // تمثل السلسلة المنفصلة عن قيمها قيمة كل اختيار في البداية: $ .noop // سيتم تشغيل هذا الحدث عند init: init: init: initbase) this.base () ؛ $ elements.each (function (i) {var $ el = $ (this) ؛ // instantiate the cascadeItem Componnation and perfect the previtem لكل مثيل إلى المثيل السابق // قم بتعيين خاصية Previtem الأولى على undefinedvar cascadeItem = new cascadeItem ($ el ، $. 1] ، القيمة: $ .trim (القيم [i])}))) ؛ items.push (cascadeItem) ؛ // ستؤدي كل تغييرات على مثيل cascade إلى إحداث حدث تغيير في مكون Cascadeview // Outsides يمكنه التعامل مع منطق العمل في هذا الاتصال/على سبيل المثال ، تعيين قيم جميع عناصر cascade على حقل مخفي للرسوم النموذجية. {that.trigger ('change.cascadeview' ، that.getValue ()) ؛}) ؛}) ؛}) ؛ // تكمل التهيئة تلقائيًا تحميل العناصر المتتالية الأولى. function () {return defaults ؛} ، getItemOptions: function () {var opts = {} ، _options = this.options ؛ for (var i in publicDefaults) {if (publicdefaults.hasownproperty (i) && i in _options) {opts [i] = من بين جميع العناصر المتتالية ، والتي هي سلسلة مفصولة بواسطة DateParator // لن تُرجع قيمة عنصر متتالي فارغ getValue: function () {var value = [] value.join (this.options.valueseparator) ؛}} ، تمديد: eventbase}) ؛ الإرجاع cascadeview ؛}) ؛CascadeItem:
define (function (require ، orports ، module) {var $ = require ('jQuery') ؛ var class = require ('mod/class') ؛ var eventbase = require ('mod/eventbase') ؛ var publicdefaults = require ('mod/cascadepublicdefaults') ؛ var ajaxcache = 'mod/ajaxache') ؛ Ajaxcache الجديد () يتم تمرير الخيار في PublicDefaults إلى CascAdeItem*/var الافتراضية = $ .Extend ({} ، publicdefaults ، {previtem: undefined ، // inter to the cascade staup: '' '// value expant of the egmant}) ؛ var cascadeim = {instancemmbers: من خلال هذا. $ el.on ('Change' ، function () of proxying elect {that.trigger ('change.cascadeitem') ؛}) هو المحتوى نفسه ، يجب مسح المحتوى الذي $ .trim (this.options.value) ؛ value! == '' && this.one ('render.cascadeitem' ، function () {// قم بتعيين القيمة الأولية التي. $ el.val (value.split ('،')) (خيارات) {return $ .extend ({} ، this.getDefaults () ، الخيارات) ؛} ، getDefaults: function () {return eventaults ؛} ، clear: function () {var $ el = this. $ el ؛ $ el ؛ الخيار $ el.children (). مرشح (': gt (0)'). إزالة () = this.options ، paramvalue ، أن = هذا ، dataIkey ؛ // dataIkey هو اسم المفتاح المستخدمة عند ذاكرة التخزين المؤقت Cache // لأن بيانات العنصر المتتالي الأول هو البيانات ذات المستوى الأعلى ، يتم استخدام مفتاح ثابت وفريد عند اختياره السابق) opts.defaultparam ؛ datakey = 'root' ؛} else {paramvalue = this.previtem.getparamvalue () ؛ dataIkey = paramValue ؛} // أولاً تحقق من وجود بيانات محملة في هذا المخطط ، وإذا كان هناك ، فسيتم عرضه مباشرة لتجنب ajaxif (dataIkey) else {var params = {} ؛ params [opts.paramname] = paramValue ؛ ajax.get (opts.url ، params) .done (function (res) {// selsolveajax يتم استخدام هذا الاتصال لتحليل البيانات التي يتم إرجاعها بواسطة Ajax خارجيًا // إنها تحتاج إلى إعادة بيانات البيانات = opts.res. {that.cache [dataIkey] = data ؛ that.render (data) ؛}}) ؛}} ، reender: function (data) {var html = [] ، opts = this.options ؛ data.foreach (function (ite) القيمة المقابلة لـ Paramfield على خاصية قيمة البيانات الخاصة بالبيانات لعنصر الخيار [opts.paramfield] ، ""> "، البند [opts.textfield] ،" </orpion> ']. انضم (' ')) ؛}) ؛ هذا. $ el.append (html.join ('')). val ('') ؛ هذا. $ el.find ('الخيار: محدد'). البيانات ('paramvalue') ؛}} ، تمديد: eventbase}) ؛4. التعليمات التجريبية
إظهار هيكل الكود:
ما هو مؤطر هو الجزء ذي الصلة من المظاهرة. html/regist.html هي الصفحة التي توضح التأثير ، و js/app/regist.js هي الإدخال إلى تأثير العرض التوضيحي js:
define (function (require ، orports ، module) {var $ = require ('jQuery') ؛ var cascadeview = require ('mod/cascadeview') ؛ functions publicsetcascadeview (fieldname ، opts) {this.cascaScadeview = new cascadeview ({$ elements: $ (#' "../API/CASCADE.JSON" ، OnChanged: This.Onchanged ، القيم: Opts.values ، keepfirstoption: this.keepfirstoption ، solvereajax: function (res) {if (res.code == 200) $ ('input [name = "licenselocation"]') ، keepfirstoption: true ، setcascadeview: publicsetcascadeview ، onChanged: function (e ، value) {location_views.licenselocation. $ input.val (value) ؛ setcascadeview: publicsetcascadeview ، onChanged: function (e ، value) {location_views.companylocation. $ input.val (value) ؛ location_views.companylocation.setcascadeview ('CompanyLocation' ، {القيم: location_views.companylocation. $ input.val ()}) ؛}) ؛انتبه إلى وظيفة الموقع المتغير _views في الكود أعلاه ، لأن هناك مكونات متعددة متتالية على الصفحة. يتم إدارة هذا المتغير فعليًا بطريقة مماثلة من خلال نموذج السياسة. إذا لم تقم بذلك ، فمن السهل إنشاء رمز مكرر ؛ هذا النموذج أيضًا أكثر مواتية لفصل وتغليف بعض منطق الأعمال في ملف الدخول ، مثل المكان الذي تتم فيه معالجة منطق العمل.
5. آخرون
ربما تكون هذه المدونة الأخيرة التي كتبتها الشركة الآن. عليك أن تذهب إلى العمل في وحدة جديدة في يومين. لست متأكدًا مما إذا كان لديك الكثير من وقت الفراغ لتسجيل أفكار عملك المعتادة ، ولكن على الأقل كنت قد طورت عادة كتابة المدونات ، وسوف تضغط على الوقت إذا لم يكن لديك وقت في المستقبل. الهدف من هذا العام هو توسيع المعرفة وتحسين جودة الكود. ستكون المدونات اللاحقة أكثر في فئة تطوير المكونات. آمل أن تتمكن من الاستمرار في الانتباه إلى موقع Wulin.com في المستقبل!