Механизм сообщения/события - это механизм, который есть почти все языки развития. Это не оригинальность устройства. Он называется сообщением (событие) на некоторых языках и в некоторых местах. На самом деле, принцип похож, но некоторые методы реализации немного сложнее. Наше устройство называется сообщением.
Основная концепция сообщения
Есть также некоторые новички, которые не очень хорошо знакомы с этим механизмом. Давайте кратко представим некоторые основные концепции. Если вы знакомы с этим, вы можете пропустить эту часть.
A/Сообщение может быть понято как структура данных, включая следующие основные части:
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. Источник сообщения запускает сообщение всем подписчикам один за другим и передает данные данных в объект функции обратного вызова.
После прочтения абстрактного описания, давайте наконец рассмотрим фактический пример разработки Device -One или возьмем do_button в качестве примера.
1. Когда пользователь нажимает на кнопку и касается ее, система получит объект кнопки в качестве источника сообщения и запустит сообщение «Touch». Любой объект функции, подписанный на сообщение «Touch», получит это сообщение и приведет к выполнению функции.
// Получить кнопку объекта var btn_hello = ui ("btn_hello"); // Определить функцию функции функции f () {// Когда кнопка btn_hello получает нажмите на щелчок пальца, будет выполнено следующий код. DeviceOne.print ("f функция получает сообщение Trigger Trigger")} // f, f Подпишитесь на сенсорное сообщение кнопки btn_hello.on ("touch", f); btn_hello.on ("touch", f);2. Мы можем определить 2 пользовательских сообщения «Сообщение1» и «Сообщение2» для объекта кнопки, и есть 2 функциональных объекта для подписки на эти 2 сообщения. Однако, в конце концов, разработчик должен вызвать функцию огня, чтобы вызвать это сообщение. Это разница между ним и системными сообщениями.
// Получить кнопку объекта var btn_hello = ui ("btn_hello"); // Определить функцию функции функции f (d) {// Когда кнопка btn_hello получает сообщение, запускаемое разработчиком, следующее код будет выполнено DeviceOne.print ("f -функции Получает сообщение, и кнопку сообщения и данные:"+d)}}}} кнопка {d)} {d)}}}}}}}}}}}}}}}}}}}}}}}}} Сообщение, запускаемое разработчиком, будет выполнено следующий код DeviceOn.print («f Функция получает сообщение сообщения, а данные сообщения:"+d)} // f, f подписывает на сенсорное сообщение кнопки btn_hello.on ("Сообщение", f); btn_hello.on ("Сообщение", f); // запускает сообщение btn_hello.fire ("Сообщение", "Data"); btn_hello.fire ("Сообщение", "Данные");Видя это, вы обязательно задаетесь вопросом, почему мы хотим настроить объекты на кнопках? Это значимое? На самом деле, это действительно бессмысленно и ненужно. Здесь мы просто принимаем кнопки в качестве примера. В обычном развитии он в основном не используется таким.
Использование сообщений
Я так много говорил раньше, и теперь это использование сообщений устройства. Это на самом деле очень просто в использовании. Приведенный выше пример в основном иллюстрирует, как использовать системные события и пользовательские события.
Позвольте мне объяснить несколько концепций
1. Все объекты DeviceOne, включая UI, MM и SM -объекты, могут быть источниками информации
// объект SM может быть источником сообщений var page = sm ("do_page"); page.on ("загружен", function ()) {// Это системное сообщение объекта страницы. Это сообщение не должно быть инициировано вручную, система будет автоматически запустить} page.on ("message", function (d)) {// Это пользовательское сообщение объекта страницы} page.fire ("Сообщение", "Data"); // объект MM может быть источником сообщения var http = mm ("do_http"); http.on ("result", function ()) {// Это системное сообщение объекта HTTP. Это сообщение не должно быть инициировано вручную, и будет автоматически запустить после получения обратной связи с HTTP -сервера} http.on («Сообщение», Функция (d)) {// Это пользовательское сообщение для объекта http} http.fire («Сообщение», «Данные»); // Объект UI может быть источником сообщения var alayout = varout = varout = ui ("alayout_id"); alayout.on ("touch", function ()) {// Это системное сообщение для объекта Alayout. Это сообщение не должно быть инициировано вручную, и оно будет инициировано нажатием мобильного телефона.2. Объект источника сообщений подходит, поэтому подписанный и запускаемый источник сообщений должен быть одним и тем же объектом с одинаковой областью. Здесь мы понимаем это в сочетании с документами обмена данными и доставкой данных.
Глядя на следующий пример, test1.ui и test2.ui могут быть в сфере страниц или не могут быть в сфере работы. Только сообщения в огне могут быть доставлены правильно.
Чтобы определить, является ли это таким же, вы можете распечатать страницу Address.getAddress ().
// подписаться на сообщение в test.ui.js var page = sm ("do_page"); deviceOne.print (page.getAddress ()); page.on ("message", function (d)) {deviceOne.print (d);} // запустите сообщение в 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 ("Сообщение", функция (d)) {deviceOne.print (d);} // запустить сообщение в 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 ("Сообщение", f); page.on ("Сообщение", f); page.fire ("Сообщение");Глядя на приведенный выше пример, в случае выполнения, он напечатает 2 это, потому что вы подписались дважды, может быть, вы бы сказали, кто напишет такой код? Фактическая ситуация определенно не так легко увидеть, что повторяющаяся функция выполняется. Фактическая ситуация часто похожа на выполнение функции ON в событии Click, а подписка повторяется один раз каждый раз, когда кнопка нажимается.
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 ("Сообщение");Глядя на пример выше, печать будет выполнена только один раз, потому что пожар будет отключен через один раз.