آلية الرسالة/الأحداث هي آلية لديها جميع لغات التطوير تقريبًا. إنها ليست أصالة DeviceOne. يطلق عليه الرسالة (الحدث) في بعض اللغات ، ورسائل في بعض الأماكن. في الواقع ، فإن المبدأ مشابه ، لكن بعض طرق التنفيذ أكثر تعقيدًا قليلاً. يسمى DeviceOne message.
رسالة المفهوم الأساسي
هناك أيضًا بعض المبتدئين الذين ليسوا على دراية بهذه الآلية. دعونا نقدم بإيجاز بعض المفاهيم الأساسية. إذا كنت على دراية به ، فيمكنك تخطي هذا الجزء.
يمكن فهم A/Message على أنها بنية بيانات ، بما في ذلك الأجزاء الأساسية التالية:
1. مصدر الرسالة: إنه مصدر الرسالة ، الكائن الذي أرسل الرسالة
2. اسم الرسالة: إنها التسمية الوحيدة للرسالة
3. بيانات الرسائل: البيانات المرفقة بعد إرسال الرسالة ، وقد تكون البيانات فارغة.
هناك نوعان من الرسائل:
1. رسالة النظام: تحتوي الرسالة التي يتم إرسالها بواسطة نظام التشغيل أو نظام DeviceOne على اسم ثابت.
2. الرسائل المخصصة: يحدد المطور الرسالة نفسها. الرسالة المرسلة من قبل نفسه تعسفي ويمكن تعريفها بشكل تعسفي.
إعطاء مثال:
على سبيل المثال ، إذا انقر المستخدم على زر do_button ، فسيتم تشغيل رسالة النظام ، بما في ذلك 3 أجزاء:
1. المصدر: كائن زر في نقطة المستخدم
2. اسم الرسالة: المس
3. بيانات الرسائل: هذه الرسالة لا توجد بيانات متصلة
على سبيل المثال ، يقوم المستخدم بإعداد حدث مخصص من خلال زر do_button ، والذي يحتوي على 3 أجزاء:
1. المصدر: كائن زر
2. اسم الرسالة: يمكن للمستخدم تحديده عرضًا ، أي AAA أو BBB أو CCC
3. بيانات الرسائل: يتم تعيين البيانات المصاحبة عند تشغيل الرسالة
النشر/وضع الاشتراك
يعد وضع النشر/الاشتراك أحد أوضاع التصميم الأكثر استخدامًا وهو جوهر آلية الرسائل. خاصتها هي تقليل درجة الاقتران ومنع الكائنين المستقلين من الاعتماد على بعضهما البعض. اسمحوا لي أن أقدم لك مقدمة موجزة ، يمكن للطلاب المألوفين تخطيها.
دعنا أولاً نوضح هذه المشكلة من مثال بسيط في الواقع ، يرجى الرجوع إلى الشكل أدناه:
من هذه الصورة يمكننا أن نرى
1. المستهلكون والناشرين لا يعرفون بعضهم البعض ، ولا يحتاج المستهلكون إلى معرفة الناشر الذي يريدون نشر المجلة ؛ لا يحتاج الناشرون إلى معرفة الشخص الذي حجز الكتاب الذي ينشره.
2. يجب على كل من المستهلكين والناشرين معرفة مكتب البريد.
3. يحتاج المستهلكون إلى إخبار مكتب البريد باسم المستهلك وعنوانه واسم المجلة الذي تريد الاشتراك فيه
4. يمكن للمستهلكين المتعددين الاشتراك في نفس المجلة
5. بعد استلام مكتب البريد للمجلة ، سوف يخطر المستهلك واحدًا تلو الآخر ، وعندما يتم تقديم الإشعار ، سيتم تسليم المجلة إلى المستهلك في نفس الوقت.
بعد النظر إلى المثال الواقعي أعلاه ، دعونا نلقي نظرة على الوصف التجريدي ونجعله أكثر وضوحًا. انظر إلى الصورة التالية:
يتوافق مع الوصف الفعلي أعلاه:
1. لا تعتمد كائنات النظام/المطور والوظيفة على بعضها البعض. يقوم النظام/المطور فقط بتشغيل رسالة ولا يهتم بمن يقبلها.
2. يجب أن تكون كائنات النظام/المطور والوظائف قادرة على الحصول على كائن مصدر الرسالة
3. عند الاشتراك في رسالة ، يجب وضع علامة على اسم الرسالة ومرجع كائن الوظيفة.
4. يمكن لشيكات وظائف متعددة الاشتراك في الرسائل التي تحمل نفس الاسم في نفس مصدر الرسالة
5. مصدر الرسائل يؤدي إلى جميع المشتركين واحدًا تلو الآخر ويمرر بيانات البيانات إلى كائن وظيفة رد الاتصال.
بعد قراءة الوصف التجريدي ، دعنا ننظر أخيرًا إلى مثال تطوير DeviceOne الفعلي ، أو نأخذ do_button كمثال.
1. عندما ينقر المستخدم على زر ويمسه ، سيحصل النظام على كائن الزر كمصدر للرسالة ، ويطلق رسالة "لمس". سيتلقى أي كائن دالة مشترك في رسالة "اللمس" هذه الرسالة ويتسبب في تنفيذ الوظيفة.
// get button button object var btn_hello = ui ("btn_hello") ؛ // تحديد وظيفة كائن الوظيفة f () {// عندما يتلقى زر btn_hello النقر فوق الإصبع ، سيتم تنفيذ الرمز التالي deviceOne.print (" DeviceOne.print ("F function تستقبل رسالة تنقر على المشغل")} // f ، F ، اشترك في رسالة اللمس في الزر btn_hello.on ("touch" ، f) ؛ btn_hello.on ("touch" ، f) ؛2. يمكننا تحديد رسالتين مخصصتين "Message1" و "Message2" لكائن الزر ، وهناك كائنان للوظيفة للاشتراك في هاتين الرسائلين. ومع ذلك ، في النهاية ، يجب على المطور الاتصال بوظيفة الحريق لتحريك هذه الرسالة. هذا هو الفرق بينه وبين رسائل النظام.
// get button button object var btn_hello = ui ("btn_hello") ؛ // تحديد وظيفة كائن الدالة f (d) {// عندما يتلقى زر btn_hello رسالة الرسالة التي يتم تشغيلها بواسطة المطورين ، يتم تنفيذ الرمز التالي. يتلقى الرسالة التي يطرحها المطور ، وسيتم تنفيذ الكود التالي DeviceOne.print ("F تستقبل الوظيفة رسالة رسالة ، وبيانات الرسالة هي:"+d)} // f ، f ، تشترك في رسالة اللمس في الزر btn_hello.on ("الرسالة" ، f) ؛ btn_hello.on ("message" ، f) ؛ // تثير الرسالة btn_hello.fire ("message" ، "data") ؛ btn_hello.fire ("Message" ، "Data") ؛رؤية هذا ، سوف تتساءل بالتأكيد لماذا نريد تخصيص الكائنات على الأزرار؟ هل هذا ذي معنى؟ في الواقع ، إنه بالفعل لا معنى له وغير ضروري. هنا نأخذ الأزرار فقط كمثال. في التنمية التقليدية ، لا يستخدم في الأساس مثل هذا.
استخدام الرسائل
لقد قلت الكثير من قبل ، والآن هو استخدام رسائل DeviceOne. إنه في الواقع بسيط للغاية للاستخدام. يوضح المثال أعلاه بشكل أساسي كيفية استخدام أحداث النظام والأحداث المخصصة.
اسمحوا لي أن أشرح بعض المفاهيم
1. يمكن أن تكون جميع كائنات DeviceOne ، بما في ذلك كائنات واجهة المستخدم و MM و SM ، مصادر معلومات
// يمكن أن يكون كائن SM هو صفحة Var Source Source = SM ("do_page") ؛ page.on ("loaded" ، function ()) {// هذه هي رسالة النظام لكائن الصفحة. لا يلزم تشغيل هذه الرسالة يدويًا ، وسيقوم النظام تلقائيًا بتشغيل الصفحة. http.on ("result" ، function ()) {// هذه هي رسالة النظام لكائن HTTP. لا يلزم تشغيل هذه الرسالة يدويًا ، وسوف يتم تشغيلها تلقائيًا بعد تلقي ملاحظات من خادم HTTP} http.on ("الرسالة" ، الوظيفة (د)) {// هذه رسالة مخصصة لكائن HTTP} http.fire ("الرسالة" ، "البيانات") ؛ UI ("alayout_id") ؛ alayout.on ("touch" ، function ()) {// هذه رسالة نظام لكائن alayout. لا يلزم تشغيل هذه الرسالة يدويًا ، وسيتم تشغيلها بواسطة الهاتف المحمول النقر فوق} alayout.on ("الرسالة" ، الوظيفة (d)) {// هذه رسالة مخصصة للكائن alayout} alayout.fire ("الرسالة" ، "البيانات") ؛2. يتم تحديد كائن مصدر الرسالة ، لذلك يجب أن يكون مصدر الرسائل المشترك والمشترك هو نفس الكائن بنفس النطاق. نحن هنا نفهمها بالاشتراك مع مستندات مشاركة البيانات وتسليم البيانات.
بالنظر إلى المثال التالي ، قد يكون Test1.ui و Test2.ui في نطاق الصفحة ، أو قد لا يكون في نطاق الوظيفة. يمكن تسليم الرسائل فقط في النار بشكل صحيح.
لتحديد ما إذا كان هو نفسه ، يمكنك طباعة صفحة عنوان الصفحة. getAddress ().
// اشترك في الرسالة في test.ui.js var page = sm ("do_page") ؛ deviceOne.print (page.getaddress ()) ؛ page.on ("message" ، function (d)) {deviceOne.print (d) ؛} // trigger in test.ui.js var page = sm ("do_page") ؛ deviceOne.print (page.getAddress ()) ؛ page.fire ("message" ، "data") ؛إذا لم تكن في نفس نطاق الصفحة ، فيمكنك الاشتراك في نطاق التطبيق الذي يمكن مشاركته مع كلتا الصفحتين
تغيير الرمز أعلاه إلى:
// اشترك في الرسالة في test.ui.js var app = sm ("do_app") ؛ app.on ("message" ، function (d)) {deviceOne.print (d) ؛} // TRIGGER the Message in test.ui.js var app = sm ("do_app") ؛ app.fire ("message" ، "data")3. يمكن للكائن الوظيفي نفسه الاشتراك مرارًا وتكرارًا في رسالة من مصدر كائن. عندما يتم تشغيل الرسالة ، سيتم تنفيذ الوظيفة عدة مرات. هذا خطأ شائع للمبتدئين.
var page = sm ("do_page") ؛ var count = ؛ function f () {deviceOne.print ("عدد عمليات الإعدام"+(count ++)) ؛} page.on ("message" ، f) ؛ page.on ("message" ، f) ؛ page.fire (بالنظر إلى المثال أعلاه ، إذا تم تنفيذه ، فسيقوم بطباعة 2 هذا ، لأنك اشتركت مرتين ، ربما ستقول من الذي يكتب مثل هذا الرمز؟ من المؤكد أن الوضع الفعلي ليس من السهل جدًا رؤية أن يتم تنفيذ الوظيفة المتكررة. غالبًا ما يكون الموقف الفعلي مثل تنفيذ وظيفة ON في حدث نقرة ، ويتم تكرار الاشتراك مرة واحدة في كل مرة يتم فيها النقر فوق الزر.
4. يجب أن يكون الاشتراك في الرسائل قبل تشغيل الرسالة ، وهو خطأ شائع للمبتدئين.
var page = sm ("do_page") ؛ var count = ؛ function f () {deviceOne.print ("عدد عمليات الإعدام"+(count ++)) ؛} page.fire ("message") ؛ page.on ("message" ، f) ؛بالنظر إلى المثال أعلاه ، إذا تم تنفيذه ، فلن يكون له أي تأثير. ربما ستقول من الذي يكتب مثل هذا الرمز؟ من المؤكد أن الوضع الفعلي ليس من السهل جدًا رؤية الترتيب. غالبًا ما يكون الموقف الفعلي مثل الوظيفة ON يتم تنفيذها في وظيفة رد الاتصال لوظيفة معينة. لا يمكنك تحديد متى يتم تنفيذ وظيفة رد الاتصال وما إذا كانت قد تم تنفيذها قبل النار. بشكل عام ، عند مواجهة هذا الموقف ، يمكنك إضافة العديد من الأجهزة. طباعة لطباعته لمعرفة ما إذا كان يتم تنفيذه أولاً أو النار أولاً.
5. إذا كان لديك اشتراك ، فستلزم الاشتراك. إلغاء الاشتراك هو وظيفة خارج. السبب في ذلك نادراً ما يتم استخدامه هو أنه عند الاقتراب ، سيتم إصدار جميع الرسائل المشتركة في نطاق الصفحة الحالي تلقائيًا.
ومع ذلك ، إذا كان اشتراك الرسالة في نطاق التطبيق ، فيجب أن تكون حريصًا على أنك قد تحتاج إلى إلغاء الاشتراك يدويًا. خلاف ذلك ، سيتم تنفيذ الوظيفة عدة مرات عند تشغيل الرسالة.
var page = sm ("do_page") ؛ var count = ؛ function f () {deviceOne.print ("عدد عمليات الإعدام"+(count ++)) ؛} page.on ("message" ، f) ؛ page.fire ("message") ؛. page.off (بالنظر إلى المثال أعلاه ، لن يتم تنفيذ الطباعة إلا مرة واحدة ، لأن النار سيتم إلغاؤها بعد مرة واحدة.