กลไกข้อความ/เหตุการณ์เป็นกลไกที่เกือบทุกภาษาพัฒนามี ไม่ใช่ความคิดริเริ่มของอุปกรณ์ มันถูกเรียกว่าข้อความ (เหตุการณ์) ในบางภาษาและข้อความในบางสถานที่ ในความเป็นจริงหลักการมีความคล้ายคลึงกัน แต่วิธีการใช้งานบางอย่างมีความซับซ้อนมากขึ้นเล็กน้อย อุปกรณ์ของเราเรียกว่าข้อความ
แนวคิดพื้นฐานของข้อความ
นอกจากนี้ยังมีผู้เริ่มต้นบางคนที่ไม่คุ้นเคยกับกลไกนี้มากนัก มาแนะนำแนวคิดพื้นฐานบางอย่างสั้น ๆ หากคุณคุ้นเคยกับมันคุณสามารถข้ามส่วนนี้ได้
A/ข้อความสามารถเข้าใจได้ว่าเป็นโครงสร้างข้อมูลรวมถึงชิ้นส่วนพื้นฐานต่อไปนี้:
1. แหล่งข้อความ: เป็นที่มาของข้อความวัตถุที่ส่งข้อความ
2. ชื่อข้อความ: เป็นป้ายกำกับเดียวของข้อความ
3. ข้อมูลข้อความ: ข้อมูลที่แนบมาหลังจากส่งข้อความและข้อมูลอาจว่างเปล่า
มีข้อความสองประเภท:
1. ข้อความของระบบ: ข้อความที่ส่งโดยระบบปฏิบัติการหรือระบบอุปกรณ์มีชื่อคงที่
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. แหล่งที่มาของข้อความทริกเกอร์ข้อความไปยังสมาชิกทั้งหมดทีละคนและส่งข้อมูลข้อมูลไปยังวัตถุฟังก์ชันการเรียกกลับ
หลังจากอ่านคำอธิบายที่เป็นนามธรรมในที่สุดลองดูตัวอย่างการพัฒนาอุปกรณ์จริงหรือใช้ตัวอย่าง do_button เป็นตัวอย่าง
1. เมื่อผู้ใช้คลิกที่ปุ่มและสัมผัสระบบจะได้รับวัตถุปุ่มเป็นแหล่งข้อความและส่งข้อความ "แตะ" วัตถุฟังก์ชั่นใด ๆ ที่สมัครรับข้อความ "สัมผัส" จะได้รับข้อความนี้และทำให้ฟังก์ชันถูกดำเนินการ
// รับปุ่มปุ่ม var btn_hello = ui ("btn_hello"); // กำหนดฟังก์ชั่นวัตถุฟังก์ชัน f () {// เมื่อปุ่ม btn_hello ได้รับการคลิกนิ้วโค้ดต่อไปนี้จะถูกเรียกใช้งาน deviceone deviceOne.print ("ฟังก์ชัน F ได้รับข้อความทริกเกอร์คลิก")} // f, f สมัครสมาชิกข้อความสัมผัสของปุ่ม btn_hello.on ("touch", f); btn_hello.on ("สัมผัส", f);2. เราสามารถกำหนด 2 ข้อความที่กำหนดเอง "Message1" และ "Message2" สำหรับวัตถุปุ่มและมีวัตถุฟังก์ชั่น 2 รายการที่จะสมัครรับข้อความ 2 ข้อความเหล่านี้ อย่างไรก็ตามในที่สุดผู้พัฒนาจะต้องเรียกฟังก์ชันไฟเพื่อเรียกข้อความนี้ นี่คือความแตกต่างระหว่างข้อความและข้อความของระบบ
// รับปุ่มวัตถุ var btn_hello = ui ("btn_hello"); // กำหนดฟังก์ชันฟังก์ชันฟังก์ชันฟังก์ชัน f (d) {// เมื่อปุ่ม btn_hello ได้รับข้อความที่เรียกใช้โดยนักพัฒนา ข้อความที่เรียกโดยนักพัฒนารหัสต่อไปนี้จะถูกเรียกใช้งาน deviceone.print ("f ฟังก์ชั่นรับข้อความและข้อมูลของข้อความคือ:"+d)} // f, f สมัครสมาชิกข้อความสัมผัสของปุ่ม btn_hello.on ("ข้อความ", f); btn_hello.on ("ข้อความ", f); // ทริกเกอร์ข้อความ btn_hello.fire ("ข้อความ", "data"); btn_hello.fire ("ข้อความ", "data");เมื่อเห็นสิ่งนี้คุณจะสงสัยว่าทำไมเราต้องการปรับแต่งวัตถุบนปุ่ม? นี่มีความหมายหรือไม่? ในความเป็นจริงมันไม่มีความหมายและไม่จำเป็น ที่นี่เราเพิ่งใช้ปุ่มเป็นตัวอย่าง ในการพัฒนาแบบดั้งเดิมมันไม่ได้ใช้เช่นนี้
การใช้ข้อความ
ฉันเคยพูดมาก่อนและตอนนี้มันคือการใช้ข้อความอุปกรณ์ จริงๆแล้วมันใช้งานง่ายมาก ตัวอย่างข้างต้นแสดงให้เห็นถึงวิธีการใช้กิจกรรมระบบและเหตุการณ์ที่กำหนดเอง
ให้ฉันอธิบายแนวคิดสองสามข้อ
1. วัตถุทั้งหมดของอุปกรณ์รวมถึงวัตถุ UI, MM และ SM สามารถเป็นแหล่งข้อมูลได้
// วัตถุ SM สามารถเป็นแหล่งที่มาของข้อความ var page = sm ("do_page"); page.on ("โหลด", function ()) {// นี่คือข้อความระบบของวัตถุหน้า ข้อความนี้ไม่จำเป็นต้องเรียกใช้ด้วยตนเองระบบจะทริกเกอร์} page.on ("ข้อความ" โดยอัตโนมัติฟังก์ชั่น (d)) {// นี่คือข้อความที่กำหนดเองของวัตถุหน้า} หน้าไฟ ("ข้อความ", "data"); // วัตถุ MM สามารถเป็นแหล่งข่าว http.on ("ผลลัพธ์", function ()) {// นี่คือข้อความระบบของวัตถุ HTTP ข้อความนี้ไม่จำเป็นต้องเรียกใช้ด้วยตนเองและจะทริกเกอร์โดยอัตโนมัติหลังจากได้รับคำติชมจากเซิร์ฟเวอร์ HTTP} http.on ("ข้อความ" ฟังก์ชั่น (d)) {// นี่คือข้อความที่กำหนดเองสำหรับวัตถุ 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 ("ข้อความ", ฟังก์ชั่น (d)) {deviceone.print (d);} // ทริกเกอร์ข้อความใน test.ui.js var SM ("do_page"); deviceone.print (page.getAddress ()); page.fire ("ข้อความ", "data");หากคุณไม่ได้อยู่ในขอบเขตหน้าเดียวกันคุณสามารถสมัครสมาชิกขอบเขตแอพที่สามารถแชร์ได้กับทั้งสองหน้า
เปลี่ยนรหัสด้านบนเป็น:
// สมัครสมาชิกข้อความใน test.ui.js var app = sm ("do_app"); app.on ("ข้อความ", ฟังก์ชั่น (d)) {deviceone.print (d);} // ทริกเกอร์ข้อความใน test.ui.js var app = sm ("do_app"); app.fire ("ข้อความ", ");3. วัตถุฟังก์ชันเดียวกันสามารถสมัครสมาชิกข้อความจากแหล่งวัตถุ เมื่อข้อความถูกเรียกใช้ฟังก์ชันจะถูกเรียกใช้งานหลายครั้ง นี่เป็นความผิดพลาดทั่วไปสำหรับผู้เริ่มต้น
var page = sm ("do_page"); var count =; function f () {deviceone.print ("จำนวนการดำเนินการ"+(count ++));} page.on ("ข้อความ", f); page.on ("ข้อความ", f); page.fire ("ข้อความ");เมื่อดูตัวอย่างด้านบนหากดำเนินการมันจะพิมพ์ 2 สิ่งนี้เพราะคุณสมัครสองครั้งคุณอาจจะบอกว่าใครจะเขียนรหัสดังกล่าว? สถานการณ์จริงนั้นไม่ง่ายเลยที่จะเห็นว่าฟังก์ชั่นซ้ำแล้วซ้ำอีก สถานการณ์จริงมักจะเหมือนกับการดำเนินการฟังก์ชัน ON ในเหตุการณ์การคลิกและการสมัครสมาชิกจะทำซ้ำทุกครั้งที่มีการคลิกปุ่ม
4. การสมัครสมาชิกข้อความจะต้องเป็นก่อนที่ข้อความจะถูกทริกเกอร์ซึ่งเป็นความผิดพลาดทั่วไปสำหรับผู้เริ่มต้น
var page = sm ("do_page"); var count =; function f () {deviceone.print ("จำนวนการดำเนินการ"+(count ++));} page.fire ("ข้อความ"); page.on ("ข้อความ", f);เมื่อดูตัวอย่างข้างต้นหากดำเนินการมันจะไม่มีผล บางทีคุณอาจจะบอกว่าใครจะเขียนรหัสดังกล่าว? สถานการณ์จริงไม่ใช่เรื่องง่ายที่จะเห็นว่าคำสั่งซื้อกลับกัน สถานการณ์จริงมักจะเหมือนฟังก์ชัน ON ถูกดำเนินการในฟังก์ชันการโทรกลับของฟังก์ชั่นบางอย่าง คุณไม่สามารถระบุได้ว่าเมื่อใดที่ฟังก์ชั่นการโทรกลับถูกเรียกใช้งานและไม่ว่าจะดำเนินการก่อนไฟ โดยทั่วไปเมื่อเผชิญกับสถานการณ์นี้คุณสามารถเพิ่มอุปกรณ์หลายตัวพิมพ์เพื่อพิมพ์เพื่อดูว่ามันถูกดำเนินการก่อนหรือไฟก่อนหรือไม่
5. หากคุณมีการสมัครสมาชิกคุณจะยกเลิกการสมัคร Unsubscribe เป็นฟังก์ชั่นปิด เหตุผลที่ไม่ค่อยได้ใช้เป็นเพราะเมื่อคุณปิดการใช้งานข้อความทั้งหมดที่สมัครเป็นสมาชิกหน้าเว็บปัจจุบันจะถูกปล่อยออกมาโดยอัตโนมัติ
อย่างไรก็ตามหากการสมัครสมาชิกข้อความอยู่ในขอบเขตของแอพคุณควรระวังว่าคุณอาจต้องยกเลิกการสมัครด้วยตนเอง มิฉะนั้นฟังก์ชั่นจะถูกดำเนินการหลายครั้งเมื่อข้อความถูกเรียกใช้
var page = sm ("do_page"); var count =; function f () {deviceone.print ("จำนวนการดำเนินการ"+(count ++));} page.on ("ข้อความ", f); page.fire ("ข้อความ"); page.off ("ข้อความ"); page.fire ("ข้อความ");เมื่อดูตัวอย่างด้านบนการพิมพ์จะดำเนินการเพียงครั้งเดียวเนื่องจากไฟจะถูกยกเลิกการสมัครสมาชิกหลังจากครั้งเดียว