メッセージ/イベントメカニズムは、ほとんどすべての開発言語が持っているメカニズムです。 DeviceOneの独創性ではありません。一部の言語ではメッセージ(イベント)と呼ばれ、一部の場所ではメッセージです。実際、原則は似ていますが、いくつかの実装方法はもう少し複雑です。私たちのdeviceoneはメッセージと呼ばれます。
メッセージの基本概念
また、このメカニズムにあまり慣れていない初心者もいます。いくつかの基本的な概念を簡単に紹介しましょう。あなたがそれに精通しているなら、あなたはこの部分をスキップすることができます。
A/メッセージは、次の基本パーツを含むデータ構造として理解できます。
1。メッセージソース:メッセージのソース、メッセージを送信したオブジェクトです
2。メッセージ名:メッセージの唯一のラベルです
3。メッセージデータ:メッセージが送信された後に添付されたデータが空になる可能性があります。
メッセージには2つのタイプがあります。
1。システムメッセージ:オペレーティングシステムまたはDeviceOneシステムから送信されたメッセージには、固定名があります。
2。カスタムメッセージ:開発者はメッセージ自体を定義します。自分で送信されたメッセージはarbitrary意的であり、arbitrarily意的に定義できます。
例を挙げてください:
たとえば、ユーザーがdo_buttonボタンをクリックすると、3つの部分を含むシステムメッセージがトリガーされます。
1。ソース:ユーザーポイントのボタンオブジェクト
2。メッセージ名:タッチ
3。メッセージデータ:このメッセージにはデータが添付されていません
たとえば、ユーザーは、DO_BUTTONボタンを介してカスタムイベントをトリガーします。
1。ソース:ボタンオブジェクト
2。メッセージ名:ユーザーはそれをさりげなく定義できます。つまり、AAA、BBB、またはCCC
3。メッセージデータ:メッセージがトリガーされると添付のデータが設定されます
公開/サブスクライブモード
パブリッシュ/サブスクライブモードは、最も一般的に使用される設計モードの1つであり、メッセージメカニズムの中核です。その特徴は、結合度を減らし、2つの独立したオブジェクトが互いに依存するのを防ぐことです。簡単な紹介をさせてください、おなじみの学生はそれをスキップできます。
まず、この問題を現実の簡単な例から説明しましょう。以下の図を参照してください。
この写真から見ることができます
1.消費者と出版社はお互いを知らず、消費者はどの出版社が雑誌を公開したいかを知る必要はありません。出版社は、どの人が出版した本を予約したかを知る必要はありません。
2。消費者と出版社の両方が郵便局を知っている必要があります。
3.消費者は、郵便局に消費者の名前と住所を伝える必要があります。
4.複数の消費者は同じ雑誌を購読できます
5.郵便局が雑誌を受け取った後、消費者に1つずつ通知し、通知が行われると同時に雑誌が消費者に届けられます。
上記の現実的な例を見た後、抽象的な説明を見て、それを明確にしましょう。次の写真を見てください。
上記の実際の例に対応します説明:
1.システム/開発者と関数オブジェクトは、互いに依存しません。システム/開発者はメッセージをトリガーするだけで、誰がそれを受け入れるかは気にしません。
2。システム/開発者と関数オブジェクトは、メッセージソースオブジェクトを取得できる必要があります
3.メッセージをサブスクライブする場合、メッセージの名前と関数オブジェクトの参照をマークする必要があります。
4.複数の関数オブジェクトは、同じメッセージソースに同じ名前のメッセージを購読できます
5.メッセージソースは、すべてのサブスクライバーへのメッセージを1つずつトリガーし、データデータをコールバック関数オブジェクトに渡します。
抽象的な説明を読んだ後、最後に実際のDeviceOne開発の例を見てみましょう。または、do_buttonを例として取ります。
1.ユーザーがボタンをクリックしてタッチすると、システムはメッセージソースとしてボタンオブジェクトを取得し、「タッチ」メッセージを発射します。 「タッチ」メッセージにサブスクライブされた関数オブジェクトは、このメッセージを受信し、関数が実行されます。
// get button object var btn_hello = ui( "btn_hello"); // define function object function f(){// btn_helloボタンが指クリックを受信すると、次のコードがdeviceone.printが実行されます。 deviceone.print( "f関数はクリックトリガーメッセージを受信します")} // f、fボタンのタッチメッセージbtn_hello.on( "touch"、f)をサブスクライブします。 btn_hello.on( "touch"、f);2.ボタンオブジェクトの2つのカスタムメッセージ「Message1」と「message2」を定義できます。これら2つのメッセージを購読する2つの関数オブジェクトがあります。ただし、最終的には、開発者はこのメッセージをトリガーするために火災関数を呼び出す必要があります。これは、ITとシステムメッセージの違いです。
//ボタンオブジェクトvar btn_hello = ui( "btn_hello"); //関数オブジェクト関数f(d){// btn_helloボタンが開発者によってトリガーされたメッセージを受信すると、次のコードがデバイスを実行します。開発者によってトリガーされたメッセージを受信し、次のコードがdeviceone.print( "fメッセージがメッセージメッセージを受信し、メッセージのデータが"+d)} // f、f、fはボタンのタッチメッセージBtn_hello.on( "メッセージ"、f)を登録します。 btn_hello.on( "message"、f); //メッセージbtn_hello.fire( "message"、 "data"); btn_hello.fire( "message"、 "data");これを見て、なぜボタンでオブジェクトをカスタマイズしたいのか間違いなく疑問に思うでしょうか?これは意味がありますか?実際、それは確かに無意味で不要です。ここでは、例としてボタンを採用しています。従来の開発では、基本的にこのように使用されていません。
メッセージの使用
私は以前にとても言ってきましたが、今ではDeviceOneメッセージの使用です。実際には非常に簡単です。上記の例は、基本的に、システムイベントとカスタムイベントの使用方法を示しています。
いくつかの概念を説明させてください
1. UI、MM、およびSMオブジェクトを含むDeviceOneのすべてのオブジェクトは、情報源になることができます
// SMオブジェクトはメッセージソースvar page = sm( "do_page"); page.on( "loaded"、function()){//これはページオブジェクトのシステムメッセージです。このメッセージは手動でトリガーする必要はありません。システムは自動的にトリガー} page.on( "message"、function(d)){//ページオブジェクトのカスタムメッセージです} page.fire( "message"、 "data"); // mmオブジェクトはメッセージソースvar http = mm( "do_http"); http.on( "result"、function()){//これはhttpオブジェクトのシステムメッセージです。このメッセージは手動でトリガーする必要はなく、HTTPサーバーからフィードバックを受信した後に自動的にトリガーされます} http.on( "message"、function(d)){//これはhttpオブジェクトのカスタムメッセージです} http.fire( "メッセージ"、 "data");/ ui( "alayout_id"); alayout.on( "touch"、function()){//これは、Alayoutオブジェクトのシステムメッセージです。このメッセージは手動でトリガーする必要はなく、携帯電話をクリックすることでトリガーされます} alayout.on( "message"、function(d)){//これは、alayoutオブジェクトのカスタムメッセージです} alayout.fire( "message"、 "data");2。メッセージソースオブジェクトはスコープされているため、サブスクライブおよびトリガーされたメッセージソースは、同じスコープを持つ同じオブジェクトでなければなりません。ここでは、データ共有とデータ配信文書と組み合わせて理解しています。
次の例を見ると、test1.uiおよびtest2.uiはページの範囲内にあるか、ジョブスコープにない場合があります。火の中のメッセージのみを正しく配信できます。
同じかどうかを判断するには、ページアドレスページを印刷できます。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 = trigger test.ui.js bar page = trigger(page.getaddress()); page.onでメッセージを購読するsm( "do_page"); deviceone.print(page.getaddress()); page.fire( "message"、 "data");同じページスコープにない場合は、両方のページで共有できるアプリスコープを購読できます
上記のコードを次のように変更します。
// test.ui.js var app = sm( "do_app"); app.on( "message"、function(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( "exections"+(count ++));} page.on( "message"、f); page.on( "message"、f); page.fire( "message");上記の例を見ると、実行された場合、2回購読しているため、これを印刷します。実際の状況は、関数の繰り返しが実行されていることを確認するのは間違いなくそれほど簡単ではありません。実際の状況は、クリックイベントでオン機能を実行するようなものであり、ボタンがクリックされるたびにサブスクリプションが繰り返されます。
4.メッセージのサブスクリプションは、メッセージがトリガーされる前に必要でなければなりません。これは初心者にとって一般的な間違いです。
var page = sm( "do_page"); var count =; function f(){deviceone.print( "exections"+(count ++));} page.fire( "message"); page.on( "message"、f);上記の例を見ると、実行された場合、効果はありません。たぶんあなたは誰がそのようなコードを書くだろうと言うでしょうか?実際の状況は、順序が逆転していることを確認するのは間違いなくそれほど簡単ではありません。実際の状況は、特定の関数のコールバック関数でON関数が実行されるようなものであることがよくあります。コールバック関数がいつ実行されるか、および火災の前に実行されるかどうかを判断することはできません。一般的に、この状況に遭遇した場合、いくつかのデバイスを追加して印刷して、最初に実行されるか、最初に火災が発生するかどうかを確認できます。
5.サブスクリプションがある場合、登録解除します。登録解除はオフ機能です。それがめったに使用されない理由は、クローゼップをすると、現在のページスコープにサブスクライブされるすべてのメッセージが自動的にリリースされるためです。
ただし、メッセージサブスクリプションがアプリの範囲にある場合は、手動で登録解除する必要があることに注意する必要があります。それ以外の場合、メッセージがトリガーされると機能が複数回実行されます。
var page = sm( "do_page"); var count =; function f(){deviceone.print( "exections"+(count ++));} page.on( "message"、f); page.fire( "message");。off( "message"); page.fire( "message");上記の例を見ると、火災は一度に登録されていないため、印刷は一度だけ実行されます。