INTRODUCTION
I'm developing an app using Electron and google maps, I need to control the state of one of the windows, for example: the user clicks the button and from this moment every click of the map adds a marker.
Well the problem is in controlling the states, tried to come up with some solution, went behind tutorials, libraries as react and / or frameworks as angular 1, 2, also falls into a frame work called Choo but in the end not I reached the conclusion, I was only more confused in how to do.
MY SOLUTION
To begin with, I'll introduce my first 'solution' attempt based on this > TUTORIAL , in which I made some changes.
function machine () {
this.estadoatual = undefined;
const estados = {
estado1: {
log:() => {console.log('teste')}
/*funçoes e comandos do estado*/
},
estado2: {
log:() => {console.log('teste2')}
/*funçoes e comandos do estado*/
}
/*...*/
};
this.changeState = (string) => {
//verifica a string e o estado atual
if ( string == 'estado1' && this.estadoatual !== estados.estado1) {
this.estadoatual = estados.estado1;
}
//verifica a string e o estado atual
if ( string == 'estado2' && this.estadoatual !== estados.estado2) {
this.estadoatual = estados.estado2;
}
}
}
const teste = new machine();
/* por favor abra o console :P */
teste.changeState('estado1');
teste.estadoatual.log();
teste.changeState('estado2');
teste.estadoatual.log();
In this solution all states would have to have the same properties to run correctly, but this would result in a lot of other functions resulting from each object, such as: test.status, current.test (), test.status. deleteRender () and so on, with this amount of functions everything is more confusing.
I thought of a second solution to my problem:
function machine () {
this.estadoatual = undefined;
const self = this;
function estado1 () {
console.log('executou o estado1');
function log () {console.log('click estado1')};// função chamada no evento de click bt1
$('#bt1').bind('click', log);
$('#bt2').bind('click', (event) => {
self.changestate('estado2');
$('#bt1').unbind('click', log);
$(this).unbind(event);
})
this.log = () => {console.log('estado1')};
}
function estado2 () {
console.log('executou o estado2');
function log () {console.log('click estado2')};// função chamada no evento de click bt1
$('#bt1').bind('click', log);
$('#bt2').bind('click', (event) => {
self.changestate('estado1');
$('#bt1').unbind('click', log);
$(this).unbind(event);
})
this.log = () => {console.log('estado2')};
}
this.changestate = (string) => {
if(string == 'estado1') {
/* neste caso não sei como fazer a verificação para não reiniciar o valor do 'estadoatual' quando o usuario clicar de novo*/
this.estadoatual = new estado1();
}
if(string == 'estado2') {
/* neste caso não sei como fazer a verificação para não reiniciar o valor do 'estadoatual' quando o usuario clicar de novo*/
this.estadoatual = new estado2();
}
}
}
const teste = new machine();
//Inicializa o app no estado1
//neste caso ele é quase todo contido em si , não necessitando de chamadas externas, mas também não descartando elas.
teste.changestate('estado1');
//consigo chamar funções que podem ser acessadas fora do escopo da função.
teste.estadoatual.log();
.bt{
height: 30px;
width: 50px;
}
#bt1{
background-color: red;
}
#bt2{
background-color: blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><divid='bt1'class='bt'></div><divid='bt2'class='bt'></div>
Thecodeaboveworksinaway...well,theredbuttonexecutesthelog,andbluechangesstate,butIcannotseewhatstatusitisinordertopreventtheuserfrom"spamming" the button and the app bugue, which would be very bad, in which case this does not happen but when it receives a command from a button that is contained in another window, the user can simply keep pressing and re-initiating the code.
Doubts
EDIT: the questions are somewhat individual, I do not know if something like this is allowed, but if you have the answer for some of them, please share with us