Le mécanisme de message / événement est un mécanisme que presque toutes les langues de développement ont. Ce n'est pas l'originalité de DeviceOne. Il est appelé message (événement) dans certaines langues et message à certains endroits. En fait, le principe est similaire, mais certaines méthodes de mise en œuvre sont un peu plus compliquées. Notre DeviceOne est appelé message.
Message concept de base
Il y a aussi des débutants qui ne connaissent pas très bien ce mécanisme. Présenons brièvement quelques concepts de base. Si vous le savez, vous pouvez ignorer cette partie.
A / Message peut être compris comme une structure de données, y compris les parties de base suivantes:
1. Source du message: c'est la source du message, l'objet qui a envoyé le message
2. Nom du message: c'est la seule étiquette du message
3. Données de message: les données jointes après l'envoi du message et les données peuvent être vides.
Il existe deux types de messages:
1. Message système: le message envoyé par le système d'exploitation ou le système de périphérique a un nom fixe.
2. Messages personnalisés: le développeur définit le message lui-même. Le message envoyé par lui-même est arbitraire et peut être défini arbitrairement.
Donnez un exemple:
Par exemple, si un utilisateur clique sur un bouton DO_BUTTON, un message système sera déclenché, y compris 3 pièces:
1. Source: objet bouton en point utilisateur
2. Nom du message: Touch
3. Données de message: ce message n'a pas de données jointes
Par exemple, l'utilisateur déclenche un événement personnalisé via le bouton DO_BUTTON, qui contient 3 pièces:
1. Source: objet bouton
2. Nom du message: l'utilisateur peut le définir avec désinvolture, à savoir AAA, BBB ou CCC
3. Données de message: les données d'accompagnement sont définies lorsque le message est déclenché
Mode de publication / d'abonnement
Le mode Publish / Sbonned est l'un des modes de conception les plus couramment utilisés et est le cœur du mécanisme de message. Sa caractéristique est de réduire le degré de couplage et d'empêcher les deux objets indépendants de dépendre les uns des autres. Permettez-moi de vous donner une brève introduction, les étudiants familiers peuvent le sauter.
Illustrons d'abord ce problème à partir d'un simple exemple en réalité, reportez-vous à la figure ci-dessous:
De cette image, nous pouvons voir
1. Les consommateurs et les éditeurs ne se connaissent pas, et les consommateurs n'ont pas besoin de savoir quel éditeur ils souhaitent publier le magazine; Les éditeurs n'ont pas besoin de savoir quelle personne a réservé le livre qu'ils publient.
2. Les consommateurs et les éditeurs doivent connaître le bureau de poste.
3. Les consommateurs doivent indiquer au bureau de poste le nom et l'adresse du consommateur et le nom du magazine auquel vous souhaitez vous abonner
4. Plusieurs consommateurs peuvent souscrire au même magazine
5. Une fois que le bureau de poste a reçu le magazine, il informera le consommateur un par un, et lorsque l'avis sera fait, le magazine sera livré au consommateur en même temps.
Après avoir regardé l'exemple réaliste ci-dessus, regardons la description abstraite et le rend plus clair. Regardez l'image suivante:
Correspond à l'exemple réel ci-dessus:
1. Les objets système / développeur et fonction ne dépendent pas les uns des autres. Le système / développeur ne déclenche qu'un message et ne se soucie pas de savoir qui l'accepte.
2. Les objets système / développeur et fonction doivent être capables d'obtenir l'objet source de message
3. Lors de l'abonnement à un message, le nom du message et la référence de l'objet fonction doivent être marqués.
4. Plusieurs objets de fonction peuvent s'abonner à des messages avec le même nom dans la même source de message
5. La source de message déclenche le message à tous les abonnés un par un et transmet les données de données à l'objet Fonction de rappel.
Après avoir lu la description du résumé, examinons enfin l'exemple de développement de DeviceOne de DeviceOne ou prenons DO_BUTTON comme exemple.
1. Lorsque l'utilisateur clique sur un bouton et le touche, le système obtiendra l'objet du bouton comme source de message et tirera un message "Appuyez sur". Tout objet de fonction abonné au message "Touch" recevra ce message et fera l'exécution de la fonction.
// Objet de bouton obtenir var btn_hello = ui ("btn_hello"); // définir la fonction de l'objet de la fonction f () {// Lorsque le bouton btn_hello reçoit un clic du doigt, la fonction du code suivant sera exécutée. DeviceOne.print ("F La fonction reçoit un message de déclenchement de clic")} // f, f abonnez-vous au message tactile du bouton btn_hello.on ("toucher", f); btn_hello.on ("touch", f);2. Nous pouvons définir 2 messages personnalisés "Message1" et "Message2" pour l'objet Button, et il y a 2 objets de fonction pour s'abonner à ces 2 messages. Cependant, au final, le développeur doit appeler la fonction de feu pour déclencher ce message. C'est la différence entre les messages du système et le système.
// Objet de bouton obtenir var btn_hello = ui ("btn_hello"); // définir la fonction de l'objet de fonction f (d) {// Lorsque le bouton btn_hello reçoit le message déclenché par le développeur, le code suivant sera exécuté deviceOne.print ("f La fonction reçoit le message du message, et le bouton de message est:" + d)} fonction f (d) {// lorsque le bouton de message est: "+ d)} fonction f (d) {// lorsque BTn_ Le message déclenché par le développeur, le code suivant sera exécuté deviceOne.print ("f La fonction reçoit un message de message, et les données du message sont:" + d)} // f, f abonne au message tactile du bouton btn_hello.on ("message", f); btn_hello.on ("message", f); // déclenche le message btn_hello.fire ("message", "data"); btn_hello.fire ("message", "data");Voyant cela, vous vous demanderez certainement pourquoi nous voulons personnaliser des objets sur les boutons? Est-ce significatif? En fait, il est en effet dénué de sens et inutile. Ici, nous prenons juste des boutons à titre d'exemple. Dans le développement conventionnel, il n'est essentiellement pas utilisé comme celui-ci.
Utilisation des messages
J'ai dit tellement de choses auparavant, et maintenant c'est l'utilisation de messages deviceOne. Il est en fait très simple à utiliser. L'exemple ci-dessus illustre essentiellement comment utiliser les événements système et les événements personnalisés.
Laissez-moi expliquer quelques concepts
1. Tous les objets de DeviceOne, y compris les objets d'interface utilisateur, MM et SM, peuvent être des sources d'information
// L'objet SM peut être la source de message var var = sm ("do_page"); page.on ("chargé", function ()) {// c'est le message système de l'objet page. Ce message n'a pas besoin d'être déclenché manuellement, le système déclenchera automatiquement} page.on ("message", fonction (d)) {// c'est le message personnalisé de l'objet page} page.fire ("message", "data"); // l'objet mm peut être la source de message var http = mm ("do_http"); http.on ("result", function ()) {// c'est le message système de l'objet HTTP. Cet besoin de déclencher manuellement, ce ne doit pas être déclenché manuellement et déclenchera automatiquement après avoir reçu les commentaires du serveur HTTP} http.on ("message", fonction (D)) {// Il s'agit d'un message personnalisé pour l'objet HTTP} Http.fire ("Message", "Data"); // L'objet UI peut être le message Source Var alayout = ui ("alayout_id"); alayout.on ("touch", function ()) {// Ceci est un message système pour l'objet alayout. Ce message n'a pas besoin d'être déclenché manuellement, et il sera déclenché par le téléphone mobile cliquant sur} alayout.on ("message", fonction (d)) {// Ceci est un message personnalisé pour l'objet alayout} alayout.fire ("message", "data");2. L'objet de source de message est dans la portée, de sorte que la source de message souscrite et déclenchée doit être le même objet avec la même portée. Ici, nous les comprenons en combinaison avec le partage de données et les documents de livraison de données.
En regardant l'exemple suivant, test1.ui et test2.ui peuvent être dans une portée de page ou ne pas être dans une portée d'emploi. Seuls les messages dans un incendie peuvent être livrés correctement.
Pour déterminer si c'est le même, vous pouvez imprimer la page de l'adresse de la page.getAddress ().
// Abonnez-vous au message dans test.ui.js var page = sm ("do_page"); deviceOne.print (page.getAddress ()); page.on ("message", fonction (d)) {deviceOne.print (d);} // déclenchent le message dans test.ui.js var page = SM ("DO_PAGE"); DeviceOne.print (page.getAddress ()); page.fire ("message", "data");Si vous n'êtes pas dans la même portée, vous pouvez vous abonner à la portée de l'application qui peut être partagée avec les deux pages
Modifiez le code ci-dessus en:
// Abonnez-vous au message dans test.ui.js var app = sm ("do_app"); app.on ("message", fonction (d)) {deviceOne.print (d);} // déclenche le message dans test.ui.js var app = sm ("do_app"); app.fire ("message", "data");3. Le même objet de fonction peut s'abonner à plusieurs reprises à un message à partir d'une source d'objet. Lorsque le message est déclenché, la fonction sera exécutée plusieurs fois. C'est une erreur courante pour les débutants.
var page = sm ("do_page"); var count =; fonction f () {deviceOne.print ("nombre d'exécutions" + (count ++));} page.on ("message", f); page.on ("message", f); page.fire ("message");En regardant l'exemple ci-dessus, s'il est exécuté, il imprimera 2, parce que vous vous êtes abonné deux fois, peut-être que vous diriez qui écrire un tel code? La situation réelle n'est certainement pas si facile à voir que la fonction répétée est exécutée. La situation réelle est souvent comme exécuter la fonction ON dans un événement de clic, et l'abonnement est répété une fois à chaque fois que le bouton est cliqué.
4. L'abonnement des messages doit être avant le déclenchement du message, ce qui est une erreur courante pour les débutants.
var page = sm ("do_page"); var count =; fonction f () {deviceOne.print ("nombre d'exécutions" + (count ++));} page.fire ("message"); page.on ("message", f);En regardant l'exemple ci-dessus, s'il est exécuté, il n'aura aucun effet. Peut-être que vous diriez qui écrire un tel code? La situation réelle n'est certainement pas si facile à voir que la commande est inversée. La situation réelle est souvent comme la fonction ON est exécutée dans la fonction de rappel d'une certaine fonction. Vous ne pouvez pas déterminer quand la fonction de rappel est exécutée et si elle est exécutée avant le feu. Généralement, lors de la rencontre de cette situation, vous pouvez ajouter plusieurs appareils.Print pour l'imprimer pour voir s'il est exécuté en premier ou tirer d'abord.
5. Si vous avez un abonnement, vous vous désabonnerez. La désinscription est une fonction désactivée. La raison pour laquelle elle est rarement utilisée est que lorsque vous vous rapprochez, tous les messages abonnés à la portée de la page actuelle seront automatiquement publiés.
Cependant, si l'abonnement du message est dans la portée de l'application, vous devez faire attention à vous désinscrire manuellement. Sinon, la fonction sera exécutée plusieurs fois lorsque le message sera déclenché.
var page = sm ("do_page"); var count =; fonction f () {deviceOne.print ("nombre d'exécutions" + (count ++));} page.on ("message", f); page.fire ("message");. Page.off ("message"); page.fire ("message");En regardant l'exemple ci-dessus, l'impression ne sera effectuée qu'une seule fois, car le feu ne sera pas abonné après une fois.