O mecanismo de mensagem/evento é um mecanismo que quase todas as linguagens de desenvolvimento têm. Não é a originalidade do dispositivo. É chamado de mensagem (evento) em alguns idiomas e mensagem em alguns lugares. De fato, o princípio é semelhante, mas alguns métodos de implementação são um pouco mais complicados. Nosso dispositivo é chamado de mensagem.
Mensagem Conceito básico
Existem também alguns iniciantes que não estão muito familiarizados com esse mecanismo. Vamos apresentar brevemente alguns conceitos básicos. Se você estiver familiarizado com isso, pode pular esta parte.
A/Mensagem pode ser entendida como uma estrutura de dados, incluindo as seguintes peças básicas:
1. Fonte da mensagem: é a fonte da mensagem, o objeto que enviou a mensagem
2. Nome da mensagem: é o único rótulo da mensagem
3. Dados da mensagem: Os dados anexados após a mensagem são enviados e os dados podem estar vazios.
Existem dois tipos de mensagens:
1. Mensagem do sistema: A mensagem enviada pelo sistema operacional ou pelo sistema DeviceOne possui um nome fixo.
2. Mensagens personalizadas: o desenvolvedor define a própria mensagem. A mensagem enviada por ele é arbitrária e pode ser definida arbitrariamente.
Dê um exemplo:
Por exemplo, se um usuário clicar em um botão do_button, uma mensagem do sistema será acionada, incluindo 3 partes:
1. Fonte: objeto de botão no ponto do usuário
2. Nome da mensagem: toque
3. Dados da mensagem: esta mensagem não possui dados anexados
Por exemplo, o usuário aciona um evento personalizado através do botão DO_Button, que contém 3 partes:
1. Fonte: objeto de botão
2. Nome da mensagem: o usuário pode defini -lo casualmente, a AAA, BBB ou CCC
3. Dados da mensagem: os dados que o acompanham são definidos quando a mensagem é acionada
Publicar/assinar o modo
O modo de publicação/assinatura é um dos modos de design mais usados e é o núcleo do mecanismo de mensagem. Sua característica é reduzir o grau de acoplamento e impedir que os dois objetos independentes dependam um do outro. Deixe -me dar uma breve introdução, os alunos familiares podem pular.
Vamos primeiro ilustrar esse problema de um exemplo simples na realidade, consulte a figura abaixo:
A partir desta foto, podemos ver
1. Consumidores e editores não se conhecem, e os consumidores não precisam saber qual editor eles querem publicar a revista; Os editores não precisam saber qual pessoa reservou o livro que publica.
2. Tanto os consumidores quanto os editores devem conhecer os correios.
3. Os consumidores precisam informar ao correio o nome e o endereço do consumidor e o nome da revista que você deseja assinar
4. Vários consumidores podem se inscrever na mesma revista
5. Depois que os correios receberem a revista, ele notificará o consumidor um por um e, quando o aviso for feito, a revista será entregue ao consumidor ao mesmo tempo.
Depois de olhar para o exemplo realista acima, vejamos a descrição abstrata e torná -la mais clara. Veja a figura a seguir:
Corresponde ao exemplo real acima descrição:
1. O sistema/desenvolvedor e objetos de função não dependem um do outro. O sistema/desenvolvedor aciona apenas uma mensagem e não se importa com quem a aceita.
2. Objetos do sistema/desenvolvedor e função devem ser capazes de obter o objeto de fonte de mensagem
3. Ao assinar uma mensagem, o nome da mensagem e a referência do objeto de função devem ser marcados.
4. Múltiplos objetos de função podem assinar mensagens com o mesmo nome na mesma fonte de mensagem
5. A fonte de mensagem aciona a mensagem a todos os assinantes um por um e passa os dados dos dados para o objeto de função de retorno de chamada.
Depois de ler a descrição abstrata, vamos finalmente olhar para o exemplo de desenvolvimento de dispositivos reais, ou tomar Do_button como exemplo.
1. Quando o usuário clica em um botão e o toca, o sistema obterá o objeto de botão como fonte de mensagem e dispara uma mensagem "touch". Qualquer objeto de função subscrito à mensagem "Touch" receberá esta mensagem e fará com que a função seja executada.
// obtenha o objeto de botão var Btn_hello = UI ("btn_hello"); // Definir função do objeto F () {// Quando o botão BTN_HELLO recebe um clique de dedo, o código seguinte será executado, executou o código de depósito. DeviceOne.print ("Função f recebe uma mensagem de clique em acionar")} // f, f assina a mensagem de toque do botão btn_hello.on ("touch", f); btn_hello.on ("touch", f);2. Podemos definir 2 mensagens personalizadas "Message1" e "Message2" para o objeto de botão, e existem 2 objetos de função para se inscrever nessas 2 mensagens. No entanto, no final, o desenvolvedor deve chamar a função de incêndio para acionar esta mensagem. Esta é a diferença entre as mensagens de TI e do sistema.
// obtenha o objeto de botão var Btn_hello = Ui ("Btn_hello"); // Definir função do objeto F (d) {// Quando o botão BTN_HELLO recebe a mensagem acionada pelo desenvolvedor, o Código seguinte será executado de dispositivo. A mensagem acionada pelo desenvolvedor, o código a seguir será executado DeviceOne.print ("f A função recebe uma mensagem de mensagem e os dados da mensagem são:"+d)} // f, f assina a mensagem de toque do botão btn_hello.on ("mensagem", f); btn_hello.on ("mensagem", f); // desencadeia a mensagem btn_hello.fire ("mensagem", "dados"); btn_hello.fire ("mensagem", "dados");Vendo isso, você definitivamente se perguntará por que queremos personalizar objetos nos botões? Isso é significativo? De fato, é de fato sem sentido e desnecessário. Aqui estamos apenas tomando botões como exemplo. No desenvolvimento convencional, basicamente não é usado assim.
Uso de mensagens
Eu já disse muito antes, e agora é o uso de mensagens DeviceOne. Na verdade, é muito simples de usar. O exemplo acima ilustra basicamente como usar eventos do sistema e eventos personalizados.
Deixe -me explicar alguns conceitos
1. Todos os objetos de DeviceOne, incluindo UI, MM e Objetos SM, podem ser fontes de informação
// O objeto SM pode ser a fonte da mensagem var página = sm ("do_page"); página.on ("carregado", function ()) {// Esta é a mensagem do sistema do objeto da página. Esta mensagem não precisa ser acionada manualmente, o sistema acionará automaticamente} página.on ("mensagem", function (d)) {// Esta é a mensagem personalizada do objeto da página} página.fire ("mensagem", "dados"); // o objeto mm pode ser a mensagem Var http = mm ("do_http"); http.on ("resultado", function ()) {// Esta é a mensagem do sistema do objeto http. Esta mensagem não precisa ser acionada manualmente e o acionará automaticamente após receber feedback do servidor http} http.on ("message", function (d)) {// Esta é uma mensagem personalizada para o objeto http} http.fire ("mensagem", "dados"); // o objeto ui ser o variout alco -° ui ("alayout_id"); alayout.on ("touch", function ()) {// Esta é uma mensagem do sistema para o objeto Alayout. Esta mensagem não precisa ser acionada manualmente e será acionada pelo telefone celular clicando} alayout.on ("mensagem", function (d)) {// Esta é uma mensagem personalizada para o objeto alayout} alayout.fire ("mensagem", "dados");2. O objeto de origem da mensagem é escopo, portanto a fonte de mensagem inscrita e acionada deve ser o mesmo objeto com o mesmo escopo. Aqui entendemos isso em combinação com o compartilhamento de dados e os documentos de entrega de dados.
Olhando para o exemplo a seguir, o test1.ui e o test2.ui podem estar em um escopo de página, ou podem não estar em um escopo de trabalho. Somente mensagens em um incêndio podem ser entregues corretamente.
Para determinar se é o mesmo, você pode imprimir a página de endereço da página.getAddress ().
// Inscreva -se a mensagem em test.ui.js var página = sm ("do_page"); depósitone.print (Page.getAddress ()); página.on ("message", function (d)) {devicene.print (d);} // aciona a mensagem no test.ui.js var = = sm ("do_page"); dispositivone.print (página.getAddress ()); página.fire ("mensagem", "dados");Se você não estiver no mesmo escopo de página, poderá se inscrever no escopo do aplicativo que pode ser compartilhado com as duas páginas
Altere o código acima para:
// assine a mensagem em test.ui.js var app = sm ("do_app"); app.on ("message", function (d)) {deposgeOne.print (d);} // aciona a mensagem em test.ui.js var app = sm ("do_app"); app.fire ("mensagem", "dados");3. O mesmo objeto de função pode assinar repetidamente uma mensagem de uma fonte de objeto. Quando a mensagem for acionada, a função será executada várias vezes. Este é um erro comum para iniciantes.
var página = sm ("do_page"); var count =; função f () {deposgeOne.print ("número de execuções"+(count ++));} página.on ("mensagem", f); página.on ("mensagem", f); página.fire ("message");Olhando para o exemplo acima, se executado, ele imprima 2, porque você assinou duas vezes, talvez diria quem escreveria esse código? A situação real definitivamente não é tão fácil de ver que a função repetida é executada. A situação real geralmente é como executar a função ON em um evento de clique, e a assinatura é repetida uma vez que o botão é clicado.
4. A assinatura das mensagens deve ser antes da mensagem ser acionada, o que é um erro comum para iniciantes.
var page = sm ("do_page"); var count =; função f () {depósitone.print ("número de execuções"+(count ++));} página.fire ("mensagem"); página.on ("mensagem", f);Olhando para o exemplo acima, se executado, isso não terá efeito. Talvez você diria quem escreveria esse código? A situação real definitivamente não é tão fácil de ver que a ordem é revertida. A situação real geralmente é como a função ON é executada na função de retorno de chamada de uma determinada função. Você não pode determinar quando a função de retorno de chamada é executada e se é executada antes do fogo. Geralmente, ao encontrar essa situação, você pode adicionar vários dispositivos.
5. Se você tiver uma assinatura, você não deve inscrever. Cancelar a inscrição é uma função off. A razão pela qual raramente é usada é porque, quando você fecha, todas as mensagens inscritos no escopo da página atual serão lançadas automaticamente.
No entanto, se a assinatura da mensagem estiver no escopo do aplicativo, você deve ter cuidado para que você precise cancelar a inscrição manual. Caso contrário, a função será executada várias vezes quando a mensagem for acionada.
var página = sm ("do_page"); var count =; função f () {deposgeOne.print ("número de execuções"+(count ++));} página.on ("message", f); página.fire ("mensagem");Olhando para o exemplo acima, a impressão será realizada apenas uma vez, porque o incêndio será cancelado após uma vez.