Der Nachrichten-/Ereignismechanismus ist ein Mechanismus, den fast alle Entwicklungssprachen haben. Es ist nicht die Originalität von DeviceOne. Es heißt Message (Ereignis) in einigen Sprachen und eine Nachricht an einigen Stellen. Tatsächlich ist das Prinzip ähnlich, aber einige Implementierungsmethoden sind etwas komplizierter. Unser GeräteOne wird als Nachricht bezeichnet.
Basiskonzept der Nachricht
Es gibt auch einige Anfänger, die mit diesem Mechanismus nicht sehr vertraut sind. Lassen Sie uns kurz einige grundlegende Konzepte einführen. Wenn Sie damit vertraut sind, können Sie diesen Teil überspringen.
A/Message kann als Datenstruktur verstanden werden, einschließlich der folgenden grundlegenden Teile:
1. Nachrichtenquelle: Es ist die Quelle der Nachricht, das Objekt, das die Nachricht gesendet hat
2. Nachrichtenname: Es ist die einzige Beschriftung der Nachricht
3. Nachrichtendaten: Die nach dem Senden der Nachricht angehängten Daten und die Daten können leer sein.
Es gibt zwei Arten von Nachrichten:
1. Systemnachricht: Die vom Betriebssystem oder DeviceOne -System gesendete Nachricht enthält einen festen Namen.
2. Benutzerdefinierte Nachrichten: Der Entwickler definiert die Nachricht selbst. Die von ihm selbst gesendete Nachricht ist willkürlich und kann willkürlich definiert werden.
Geben Sie ein Beispiel:
Wenn ein Benutzer beispielsweise auf eine Taste do_button klickt, wird eine Systemmeldung ausgelöst, einschließlich 3 Teile:
1. Quelle: Schaltflächenobjekt im Benutzerpunkt
2. Nachrichtenname: Berührung
3. Nachrichtendaten: Diese Nachricht enthält keine Daten beigefügt
Zum Beispiel löst der Benutzer ein benutzerdefiniertes Ereignis über die Taste do_button aus, die 3 Teile enthält:
1. Quelle: Schaltflächenobjekt
2. Nachrichtenname: Der Benutzer kann ihn beiläufig definieren, nämlich AAA, BBB oder CCC
3. Nachrichtendaten: Die begleitenden Daten werden festgelegt, wenn die Nachricht ausgelöst wird
Modus veröffentlichen/abonnieren
Der Veröffentlichung/Abonnement -Modus ist einer der am häufigsten verwendeten Designmodi und der Kern des Nachrichtenmechanismus. Sein Merkmal besteht darin, den Kopplungsgrad zu reduzieren und die beiden unabhängigen Objekte voneinander abhängig zu machen. Lassen Sie mich Ihnen eine kurze Einführung geben, bekannte Schüler können sie überspringen.
Veranschaulichen wir zunächst dieses Problem aus einem einfachen Beispiel in der Realität. Weitere Informationen finden Sie in der folgenden Abbildung:
Von diesem Bild können wir sehen
1. Verbraucher und Verleger kennen sich nicht, und Verbraucher müssen nicht wissen, welchen Verlag sie veröffentlichen möchten. Verlage müssen nicht wissen, welche Person das von ihnen veröffentlichte Buch gebucht hat.
2. Sowohl Verbraucher als auch Verlage müssen die Post kennen.
3.. Verbraucher müssen dem Postamt den Namen und die Adresse des Verbrauchers und den Magazinnamen mitteilen, den Sie abonnieren möchten
4.. Mehrere Verbraucher können das gleiche Magazin abonnieren
5. Nachdem das Postamt das Magazin erhalten hat, wird der Verbraucher nacheinander benachrichtigt, und wenn die Bekanntmachung gemacht wird, wird das Magazin gleichzeitig an den Verbraucher geliefert.
Nachdem wir uns das obige realistische Beispiel angesehen haben, schauen wir uns die abstrakte Beschreibung an und machen Sie es klarer. Schauen Sie sich das folgende Bild an:
Entspricht der obigen tatsächlichen Beispielbeschreibung:
1. Das System/Entwickler und die Funktionsobjekte hängen nicht voneinander ab. Das System/der Entwickler löst nur eine Nachricht aus und es ist egal, wer sie akzeptiert.
2. System/Entwickler und Funktionsobjekte müssen in der Lage sein, das Nachrichtenquellenobjekt zu erhalten
3. Wenn Sie eine Nachricht abonnieren, muss der Name der Nachricht und die Referenz des Funktionsobjekts gekennzeichnet werden.
4.. Mehrere Funktionsobjekte können Nachrichten mit demselben Namen in derselben Nachrichtenquelle abonnieren
5. Die Nachrichtenquelle leitet die Nachricht alle Abonnenten einzeln aus und übergeben die Datendaten an das Callback -Funktionsobjekt.
Schauen wir uns nach dem Lesen der abstrakten Beschreibung endlich das tatsächliche Beispiel für Geräte -Entwicklung an oder nehmen Sie do_button als Beispiel an.
1. Wenn der Benutzer auf eine Schaltfläche klickt und ihn anfasst, erhält das System das Schaltflächenobjekt als Meldungsquelle und schießt eine "Berührungsmeldung" ab. Jedes Funktionsobjekt, das der Nachricht "Touch" abonniert hat, empfängt diese Nachricht und führt dazu, dass die Funktion ausgeführt wird.
// Button -Objekt var btn_hello = ui ("btn_hello"); // Funktionsobjektfunktion f () {// Wenn btn_hello -Taste ein Fingerklick definiert, wird der folgende Code ausgeführt. DeviceOne.print ("F -Funktion empfängt eine Klick -Trigger -Nachricht")} // f, f Abonnieren Sie die Touch Message der Taste btn_hello.on ("touch", f); btn_hello.on ("touch", f);2. Wir können 2 benutzerdefinierte Nachrichten "Message1" und "Message2" für das Schaltflächenobjekt definieren, und es gibt 2 Funktionsobjekte, die diese 2 Nachrichten abonnieren können. Am Ende muss der Entwickler jedoch die Feuerfunktion aufrufen, um diese Nachricht auszulösen. Dies ist der Unterschied zwischen IT- und Systemmeldungen.
// Taste Object var btn_hello = ui ("btn_hello"); // Funktionsobjektfunktion f (d) {// Wenn btn_hello -Taste die vom Entwickler ausgelöste Nachricht empfängt, wird der folgende Code ausgeführt. Die vom Entwickler ausgelöste Meldung wird der folgende Code ausgeführt. btn_hello.on ("message", f); // löst die Nachricht btn_hello.fire ("message", "data") aus; btn_hello.fire ("message", "data");Wenn Sie dies sehen, werden Sie sich auf jeden Fall fragen, warum wir Objekte auf Schaltflächen anpassen möchten? Ist das sinnvoll? Tatsächlich ist es in der Tat bedeutungslos und unnötig. Hier nehmen wir nur Knöpfe als Beispiel. In der konventionellen Entwicklung wird es im Grunde nicht so verwendet.
Verwendung von Nachrichten
Ich habe schon so viel gesagt, und jetzt ist es die Verwendung von GeräteOne -Nachrichten. Es ist eigentlich sehr einfach zu bedienen. Das obige Beispiel zeigt grundsätzlich, wie Systemereignisse und benutzerdefinierte Ereignisse verwendet werden.
Lassen Sie mich ein paar Konzepte erklären
1. Alle Objekte von DeviceOne, einschließlich UI-, MM- und SM -Objekten, können Informationsquellen sein
// Das SM -Objekt kann die Nachrichtenquelle var page = sm ("do_page"); page.on ("geladen", function ()) {// Dies ist die Systemnachricht des Seitenobjekts. Diese Nachricht muss nicht manuell ausgelöst werden. Das System löst automatisch} page.on ("meldung", Funktion (d)) {// Dies ist die benutzerdefinierte Nachricht des Seitenobjekts} page.fire ("meldung", "data"); // Das MM -Objekt kann die Nachrichtenquelle sein. http.on ("result", function ()) {// Dies ist die Systemnachricht des HTTP -Objekts. Diese Nachricht muss nicht manuell ausgelöst werden und löst automatisch nach dem Empfangen von Feedback aus dem HTTP -Server} http.on ("Nachricht", Funktion (d)) {// Dies ist eine benutzerdefinierte Nachricht für das HTTP -Objekt} http.fire ("Nachricht", "Daten"). ui ("alayout_id"); alayout.on ("touch", function ()) {// Dies ist eine Systemnachricht für das Alayout -Objekt. Diese Nachricht muss nicht manuell ausgelöst werden und wird vom Mobiltelefon ausgelöst, um} alayout.on ("meldung", Funktion (d)) {// Dies ist eine benutzerdefinierte Nachricht für das Alayout -Objekt} alayout.fire ("Nachricht", "Daten").2. Das Meldungsquellenobjekt ist skopiert, sodass die abonnierte und ausgelöste Nachrichtenquelle das gleiche Objekt mit demselben Bereich sein muss. Hier verstehen wir es in Kombination mit Datenaustausch- und Datenbereitstellungsdokumenten.
Wenn Sie sich das folgende Beispiel ansehen, können Test1.UI und Test2.UI in einem Seitenbereich befinden oder nicht in einem Jobbereich. Nur Nachrichten in einem Feuer können korrekt abgegeben werden.
Um festzustellen, ob es gleich ist, können Sie die Seite der Seitenadress -Seite drucken.getAddress ().
// Abonnieren Sie die Nachricht in test.ui.js var page = sm ("do_page"); DeviceOne.print (page.getAddress ()); page.on ("meldung", function (d)) {deviceone.print (d);} // Die Nachricht in test.ui.js var page = page = auslösen sm ("do_page"); DeviceOne.print (page.getAddress ()); page.fire ("meldung", "data");Wenn Sie sich nicht im selben Seitenbereich befinden, können Sie den App -Bereich abonnieren, der mit beiden Seiten gemeinsam genutzt werden kann
Ändern Sie den obigen Code in:
// Abonnieren Sie die Nachricht in test.ui.js var app = sm ("do_app"); app.on ("message", function (d)) {deviceone.print (d);} // Die Nachricht in test.ui.js var app = sm ("do_app"); app.fire ("message", "data");3. Das gleiche Funktionsobjekt kann eine Nachricht von einer Objektquelle wiederholt abonnieren. Wenn die Nachricht ausgelöst wird, wird die Funktion mehrmals ausgeführt. Dies ist ein häufiger Fehler für Anfänger.
var page = sm ("do_page"); var count =; Funktion f () {DeviceOne.print ("Anzahl der Ausführungen"+(count ++));} page.on ("meldung", f); page.on ("meldung", f); page.fire ("meldung");Wenn Sie sich das obige Beispiel ansehen, wenn Sie ausgeführt würden, wird es 2 gedruckt, da Sie zweimal abonniert haben, vielleicht würden Sie sagen, wer solchen Code schreiben würde? Die tatsächliche Situation ist definitiv nicht so leicht zu erkennen, dass die wiederholte Funktionen ausgeführt wird. Die tatsächliche Situation ist oft wie die Ausführung der Ein -Funktion in einem Klickereignis, und das Abonnement wird jedes Mal wiederholt, wenn die Schaltfläche klickt.
4. Das Abonnement der Nachrichten muss vor der Auslösung der Nachricht erfolgen, was ein häufiger Fehler für Anfänger ist.
var page = sm ("do_page"); var count =; Funktion f () {DeviceOne.print ("Anzahl der Ausführungen"+(count ++));} page.fire ("message"); page.on ("message", f);Wenn Sie sich das obige Beispiel ansehen, wenn es ausgeführt wird, wird es keine Wirkung haben. Vielleicht würden Sie sagen, wer solchen Code schreiben würde? Die tatsächliche Situation ist definitiv nicht so leicht zu erkennen, dass die Reihenfolge umgekehrt ist. Die tatsächliche Situation ist oft wie die Funktion, die in der Rückruffunktion einer bestimmten Funktion ausgeführt wird. Sie können nicht feststellen, wann die Rückruffunktion ausgeführt wird und ob sie vor dem Brand ausgeführt wird. Im Allgemeinen können Sie bei der Begegnung dieser Situation mehrere Geräte hinzufügen, um sie zu drucken, um festzustellen, ob es zuerst ausgeführt wird oder zuerst feuert.
5. Wenn Sie ein Abonnement haben, werden Sie abmelden. Das Abbestellen ist eine Ausschaltung. Der Grund, warum es selten verwendet wird, ist, dass beim Einschluss alle Nachrichten, die dem aktuellen Seitenumfang abonniert sind, automatisch veröffentlicht werden.
Wenn sich das Nachrichtenabonnement jedoch im Rahmen der App befindet, sollten Sie darauf achten, dass Sie möglicherweise manuell abbestellen müssen. Andernfalls wird die Funktion mehrmals ausgeführt, wenn die Nachricht ausgelöst wird.
var page = sm ("do_page"); var count =; Funktion f () {DeviceOne.print ("Anzahl der Ausführungen"+(count ++));} page.on ("meldung", f); page.fire ("meldung");Wenn man sich das obige Beispiel ansieht, wird der Druck nur einmal durchgeführt, da das Feuer nach einmaliger Zeit abgemeldet wird.