메시지/이벤트 메커니즘은 거의 모든 개발 언어가 가지고있는 메커니즘입니다. 장치 온의 독창성이 아닙니다. 일부 언어로는 메시지 (이벤트)라고하며 어떤 곳에서는 메시지가 있습니다. 실제로 원칙은 비슷하지만 일부 구현 방법은 조금 더 복잡합니다. 우리의 DeviceOne을 메시지라고합니다.
메시지 기본 개념
이 메커니즘에 익숙하지 않은 초보자도 있습니다. 몇 가지 기본 개념을 간단히 소개하겠습니다. 익숙하다면이 부분을 건너 뛸 수 있습니다.
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. 메시지 소스는 모든 가입자에게 메시지를 하나씩 트리거하고 데이터 데이터를 콜백 함수 객체에 전달합니다.
추상 설명을 읽은 후에는 실제 DeviceOne 개발 예를 살펴 보거나 DO_BUTTON을 예로 들어 보겠습니다.
1. 사용자가 버튼을 클릭하고 터치하면 시스템은 메시지 소스로 버튼 객체를 얻고 "터치"메시지를 발사합니다. "터치"메시지에 가입 한 모든 기능 객체는이 메시지를 받고 함수가 실행됩니다.
// 버튼 객체 가져 오기 var var btn_hello = ui ( "btn_hello"); // 기능 객체 함수 정의 f () {// btn_hello 버튼이 손가락 클릭을 받으면 다음 코드가 실행됩니다. 다음 코드가 실행됩니다. DeviceOne.print ( "f 함수는 클릭 트리거 메시지를 수신합니다."} // f, f 버튼의 터치 메시지 btn_hello.on ( "touch", f); btn_hello.on ( "터치", f);2. 버튼 객체에 대해 "message1"및 "messag 그러나 결국 개발자는 화재 기능을 호출 하여이 메시지를 트리거해야합니다. 이것이 시스템과 시스템 메시지의 차이입니다.
// 버튼 객체 var var var btn_hello = ui ( "btn_hello"); // 기능 객체 기능 정의 함수 f (d) {// btn_hello 버튼이 개발자가 트리거 된 메시지를 수신하면 다음 코드가 DeviceOne.print로 실행됩니다 ( "f 함수는 메시지를 수신하고 메시지 수익 F (d) {// {// 개발자가 트리거되고 다음 코드가 DeviceOne.print로 실행됩니다 ( "f 함수는 메시지 메시지를 받고 메시지의 데이터는"+d)} // f, f 버튼의 터치 메시지 btn_hello.on ( "메시지", f)에 가입합니다. btn_hello.on ( "message", f); // 메시지를 트리거합니다. btn_hello.fire ( "메시지", "데이터");이것을보고, 왜 우리가 버튼에서 객체를 사용자 정의하고 싶은지 확실히 궁금 할 것입니다. 이것은 의미가 있습니까? 사실, 그것은 실제로 의미가없고 불필요합니다. 여기서 우리는 단지 단지 버튼을 예로 들고 있습니다. 기존의 발전에서는 기본적으로 이와 같이 사용되지 않습니다.
메시지 사용
나는 이전에 너무 많은 말을했으며 이제는 장치를 사용하는 것입니다. 실제로 사용하는 것은 매우 간단합니다. 위의 예는 기본적으로 시스템 이벤트 및 사용자 정의 이벤트 사용 방법을 보여줍니다.
몇 가지 개념을 설명하겠습니다
1. UI, MM 및 SM 객체를 포함한 모든 장치 객체는 정보 소스 일 수 있습니다.
// SM 객체는 메시지 소스가 될 수 있습니다. var page = sm ( "do_page"); page.on ( "loaded", function ()) {// 이것은 페이지 객체의 시스템 메시지입니다. 이 메시지는 수동으로 트리거 될 필요가 없으며 시스템은} page.on ( "message", function (d)) {// Page object} page.fire ( "message", "data")의 사용자 정의 메시지입니다. mm 객체는 메시지 소스 var http = mm ( "do_http") 일 수 있습니다. http.on ( "result", function ()) {// 이것은 http 객체의 시스템 메시지입니다. 이 메시지는 수동으로 트리거 될 필요가 없으며 http server} http.on ( "message", function (d))에서 피드백을받은 후 자동으로 트리거됩니다. {// http 객체} http.fire ( "message", "data")에 대한 사용자 정의 메시지입니다. ui ( "alayout_id"); alayout.on ( "touch", function ()) {// 이것은 alayout 객체에 대한 시스템 메시지입니다. 이 메시지는 수동으로 트리거 될 필요가 없으며 휴대 전화 클릭} alayout.on ( "메시지", function (d)) {// alayout 객체} alayout.fire ( "message", "data")에 대한 사용자 정의 메시지입니다.2. 메시지 소스 객체가 스코핑되어 있으므로 구독 및 트리거 된 메시지 소스는 동일한 범위를 가진 동일한 객체 여야합니다. 여기서는 데이터 공유 및 데이터 전달 문서와 함께이를 이해합니다.
다음 예를 살펴보면 test1.ui 및 test2.ui는 페이지 범위에 있거나 작업 범위에 있지 않을 수 있습니다. 화재로 된 메시지 만 올바르게 전달할 수 있습니다.
동일인지 확인하려면 페이지 주소 페이지를 인쇄 할 수 있습니다.
// 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 ( "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 ( "숫자 수"+(count ++));} page.on ( "message", f); page.on ( "message", f); page.fire ( "message");위의 예를 살펴보면 실행되면 2 개의 구독했기 때문에 2 가지를 인쇄합니다. 누가 그러한 코드를 쓸 것인지 말할 수 있습니까? 실제 상황은 반복 된 기능이 실행된다는 것을 알기가 쉽지 않습니다. 실제 상황은 종종 클릭 이벤트에서 ON 기능을 실행하는 것과 같습니다. 버튼을 클릭 할 때마다 구독이 한 번 반복됩니다.
4. 메시지 구독은 메시지가 트리거되기 전에 있어야하며 이는 초보자에게 일반적인 실수입니다.
var page = sm ( "do_page"); var count =; function f () {deviceOne.print ( "실행 수"+(count ++));} page.fire ( "message"); page.on ( "message", f);위의 예를 살펴보면 실행되면 효과가 없습니다. 누가 그런 코드를 쓸 것인가? 실제 상황은 주문이 반전된다는 것을 알기가 쉽지 않습니다. 실제 상황은 종종 특정 함수의 콜백 함수에서 ON 함수가 실행되는 것과 같습니다. 콜백 함수가 언제 실행되는지와 화재 전에 실행되는지 여부를 결정할 수 없습니다. 일반적 으로이 상황에 직면 할 때 여러 장치를 추가하여 인쇄하여 먼저 실행되는지 또는 발사되는지 확인하십시오.
5. 구독이 있으면 구독을 취소합니다. 구독 취소는 OFF 기능입니다. 거의 사용되지 않는 이유는 폐쇄되면 현재 페이지 범위에 가입 한 모든 메시지가 자동으로 해제되기 때문입니다.
그러나 메시지 구독이 앱의 범위에 있으면 수동으로 구독을 취소해야 할 수도 있습니다. 그렇지 않으면 메시지가 트리거되면 함수가 여러 번 실행됩니다.
var page = sm ( "do_page"); var count =; function f () {deviceOne.print ( "숫자 수"+(count ++));} page.on ( "message", f); page.fire ( "message");위의 예를 살펴보면 불이 한 번만 구독되지 않기 때문에 인쇄는 한 번만 수행됩니다.