El mecanismo de mensaje/evento es un mecanismo que tienen casi todos los idiomas de desarrollo. No es la originalidad de los dispositivos. Se llama mensaje (evento) en algunos idiomas y mensaje en algunos lugares. De hecho, el principio es similar, pero algunos métodos de implementación son un poco más complicados. Nuestro dispositivo se llama mensaje.
Mensaje concepto básico
También hay algunos principiantes que no están muy familiarizados con este mecanismo. Presentemos brevemente algunos conceptos básicos. Si está familiarizado con él, puede omitir esta parte.
A/Mensaje puede entenderse como una estructura de datos, incluidas las siguientes partes básicas:
1. Fuente del mensaje: es la fuente del mensaje, el objeto que envió el mensaje
2. Nombre del mensaje: es la única etiqueta del mensaje
3. Datos del mensaje: los datos adjuntos después de que se envía el mensaje y los datos pueden estar vacíos.
Hay dos tipos de mensajes:
1. Mensaje del sistema: el mensaje enviado por el sistema operativo o el sistema de dispositivos tiene un nombre fijo.
2. Mensajes personalizados: el desarrollador define el mensaje en sí. El mensaje enviado por él mismo es arbitrario y se puede definir arbitrariamente.
Dar un ejemplo:
Por ejemplo, si un usuario hace clic en un botón Do_Button, se activará un mensaje del sistema, incluidas 3 partes:
1. Fuente: Objeto de botón en el punto de usuario
2. Nombre del mensaje: toque
3. Datos del mensaje: este mensaje no tiene datos adjuntos
Por ejemplo, el usuario desencadena un evento personalizado a través del botón Do_Button, que contiene 3 partes:
1. Fuente: Objeto de botón
2. Nombre del mensaje: el usuario puede definirlo casualmente, a saber, AAA, BBB o CCC
3. Datos del mensaje: los datos adjuntos se establecen cuando el mensaje se activa
Modo de publicación/suscripción
El modo de publicación/suscripción es uno de los modos de diseño más utilizados y es el núcleo del mecanismo de mensajes. Su característica es reducir el grado de acoplamiento y evitar que los dos objetos independientes dependan unos de otros. Déjame darte una breve presentación, los estudiantes familiares pueden omitirla.
Primero ilustramos este problema a partir de un ejemplo simple en realidad, consulte la figura a continuación:
De esta imagen podemos ver
1. Los consumidores y editores no se conocen, y los consumidores no necesitan saber qué editor quiere publicar la revista; Los editores no necesitan saber qué persona ha reservado el libro que publican.
2. Tanto los consumidores como los editores deben conocer la oficina de correos.
3. Los consumidores deben decirle a la oficina de correos el nombre y la dirección del consumidor y el nombre de la revista al que desea suscribirse
4. Múltiples consumidores pueden suscribirse a la misma revista
5. Después de que la oficina de correos reciba la revista, notificará al consumidor uno por uno, y cuando se haga el aviso, la revista se entregará al consumidor al mismo tiempo.
Después de mirar el ejemplo realista anterior, veamos la descripción abstracta y lo aclare. Mira la siguiente imagen:
Corresponde a la descripción de ejemplo real anterior:
1. El sistema/desarrollador y los objetos de función no dependen unos de otros. El sistema/desarrollador solo desencadena un mensaje y no le importa quién lo acepte.
2. Sistema/desarrollador y objetos de función deben poder obtener el objeto de origen de mensajes
3. Al suscribirse a un mensaje, el nombre del mensaje y la referencia del objeto de función deben marcarse.
4. Múltiples objetos de función pueden suscribirse a mensajes con el mismo nombre en la misma fuente de mensaje
5. La fuente de mensaje desencadena el mensaje a todos los suscriptores uno por uno y pasa los datos de datos al objeto de función de devolución de llamada.
Después de leer la descripción del resumen, finalmente veamos el ejemplo real de desarrollo de dispositivos, o tomemos do_button como ejemplo.
1. Cuando el usuario hace clic en un botón y lo toca, el sistema obtendrá el objeto del botón como fuente de mensajes y disparará un mensaje de "toque". Cualquier objeto de función suscrito al mensaje "Toque" recibirá este mensaje y hará que la función se ejecute.
// Objetivo de botón Obtener el objeto var btn_hello = ui ("btn_hello"); // define de la función objeto function f () {// El botón btn_hello recibe un dedo que haga clic, el siguiente código se ejecutará dispositivos. DeviceOne.print ("La función F recibe un mensaje de activación de clics")} // f, f suscribirse al mensaje táctil del botón btn_hello.on ("touch", f); btn_hello.on ("touch", f);2. Podemos definir 2 mensajes personalizados "Message1" y "Message2" para el objeto de botón, y hay 2 objetos de función para suscribirse a estos 2 mensajes. Sin embargo, al final, el desarrollador debe llamar a la función de fuego para activar este mensaje. Esta es la diferencia entre los mensajes de TI y del sistema.
// Objetivo de botón Get Botón var btn_hello = ui ("btn_hello"); // define la función de objeto de función f (d) {// cuando el botón btn_hello recibe el mensaje desencadenado por el desarrollador, el siguiente código se ejecutará dispositivos. El mensaje activado por el desarrollador, el siguiente código se ejecutará Deviceone.print ("f la función recibe un mensaje de mensaje, y los datos del mensaje son:"+d)} // f, F se suscribe al mensaje táctil del botón btn_hello.on ("mensaje", f); btn_hello.on ("mensaje", f); // desencadena el mensaje btn_hello.fire ("mensaje", "datos"); btn_hello.fire ("mensaje", "datos");Al ver esto, definitivamente te preguntarás por qué queremos personalizar los objetos en los botones. ¿Es esto significativo? De hecho, de hecho no tiene sentido e innecesario. Aquí solo estamos tomando botones como ejemplo. En el desarrollo convencional, básicamente no se usa así.
Uso de mensajes
He dicho mucho antes, y ahora es el uso de mensajes de dispositivos. En realidad es muy simple de usar. El ejemplo anterior básicamente ilustra cómo usar eventos del sistema y eventos personalizados.
Déjame explicar algunos conceptos
1. Todos los objetos de dispositivos, incluidos los objetos de IU, MM y SM, pueden ser fuentes de información
// El objeto SM puede ser la fuente de mensaje var página = SM ("do_page"); page.on ("cargada", function ()) {// Este es el mensaje del sistema del objeto de página. Este mensaje no necesita activarse manualmente, el sistema activará automáticamente} page.on ("mensaje", function (d)) {// Este es el mensaje personalizado del objeto de página} página.fire ("mensaje", "datos"); // El objeto mm puede ser la fuente del mensaje var http = mm ("do_http"); http.on ("resultado", function ()) {// Este es el mensaje del sistema del objeto http. Este mensaje no es necesario activarse manualmente, y se activará automáticamente después de recibir comentarios del servidor HTTP} http.on ("mensaje", function (d)) {// Este es un mensaje personalizado para el objeto http} http.fire ("mensaje", "datos"); // El objeto UI puede ser el mensaje de mensaje var aLAYOUT = ui ("alayout_id"); alayout.on ("touch", function ()) {// Este es un mensaje del sistema para el objeto alayout. Este mensaje no necesita ser activado manualmente, y el teléfono móvil se activará haciendo clic en} alayout.on ("mensaje", función (d)) {// Este es un mensaje personalizado para el objeto alayout} alayout.fire ("mensaje", "datos");2. El objeto de origen del mensaje se alcanza, por lo que la fuente de mensaje suscrito y activado debe ser el mismo objeto con el mismo alcance. Aquí lo entendemos en combinación con documentos de intercambio de datos y entrega de datos.
Mirando el siguiente ejemplo, Test1.ui y test2.Ui pueden estar en un alcance de página, o no estar en un alcance de trabajo. Solo los mensajes en un incendio se pueden entregar correctamente.
Para determinar si es lo mismo, puede imprimir la dirección de la página Page.getAddress ().
// suscribirse al mensaje en test.ui.js var page = sm ("do_page"); deviceone.print (page.getaddress ()); page.on ("mensaje", function (d)) {DeviceOn.print (d);} // activar el mensaje en test.ui.js var página = = sm ("do_page"); dispositivoeNe.print (page.getAddress ()); page.fire ("mensaje", "datos");Si no está en el mismo alcance de la página, puede suscribirse al alcance de la aplicación que se puede compartir con ambas páginas
Cambie el código anterior a:
// suscribirse al mensaje en test.ui.js var app = sm ("do_app"); app.on ("mensaje", function (d)) {Deviceone.print (d);} // activar el mensaje en test.ui.js var app = sm ("do_app"); app.fire ("mensaje", "datos");;3. El mismo objeto de función puede suscribirse repetidamente a un mensaje desde una fuente de objeto. Cuando se activa el mensaje, la función se ejecutará varias veces. Este es un error común para los principiantes.
var page = sm ("do_page"); var count =; function f () {Deviceone.print ("Número de ejecuciones"+(count ++));} page.on ("Mensaje", f); page.on ("Mensaje", f); Page.fire ("Mensaje");Mirando el ejemplo anterior, si se ejecuta, imprimirá esto, porque se ha suscrito dos veces, ¿tal vez diría quién escribiría dicho código? La situación real definitivamente no es tan fácil de ver que se ejecuta la función Repited ON. La situación real a menudo es como ejecutar la función ON en un evento de clic, y la suscripción se repite una vez cada vez que se hace clic en el botón.
4. La suscripción de los mensajes debe ser antes de que se active el mensaje, lo cual es un error común para los principiantes.
var page = sm ("do_page"); var count =; function f () {Deviceone.print ("Número de ejecuciones"+(count ++));} page.fire ("Mensaje"); Page.on ("Mensaje", F);Mirando el ejemplo anterior, si se ejecuta, no tendrá ningún efecto. ¿Quizás dirías quién escribiría dicho código? La situación real definitivamente no es tan fácil de ver que el pedido se invierte. La situación real a menudo es como la función ON se ejecuta en la función de devolución de llamada de una determinada función. No puede determinar cuándo se ejecuta la función de devolución de llamada y si se ejecuta antes del fuego. En general, al encontrar esta situación, puede agregar varios dispositivos. Imprima para imprimirlo para ver si se ejecuta primero o se dispara primero.
5. Si tiene una suscripción, se cancela. Cancionar la suscripción es una función de desactivación. La razón por la que rara vez se usa es porque cuando cierre los mensajes, todos los mensajes suscritos al alcance de la página actual se lanzarán automáticamente.
Sin embargo, si la suscripción del mensaje está en el alcance de la aplicación, debe tener cuidado de que deba darse de baja manualmente. De lo contrario, la función se ejecutará varias veces cuando se active el mensaje.
var page = sm ("do_page"); var count =; function f () {deviceone.print ("número de ejecuciones"+(count ++));} page.on ("mensaje", f); page.fire ("mensaje") ;.page.Off ("Mensaje"); Page.fire ("Mensaje");Mirando el ejemplo anterior, la impresión solo se realizará una vez, porque el fuego se dejará de baja después de una vez.