5
respostas

Problemas com array

Estou trabalhando em um projeto pessoal e estou com um problema no qual a informação do array não passa por determinada função.

export default class Start{
    constructor(pincel, tela){
        this.tela = tela;
        this.pincel = pincel
         this.itemSelecionado = [-0.6,-0.4,-0.3,-0.2,-0.1,0.2,0.4,0.6,0.8,1.0,1.3,1.5];
         this.corNormal = "white";
         this.tamanho = 5;
         this.alteracaoCanvas = 2;
         this.posicaoInicial = 20;

        this.canvas = { x:[], valor:[] }; <---- esse array aqui!
        }


            updateArray(){
        this.itemSelecionado.forEach(() => {
            this.canvas.valor.push(160);
            this.canvas.x.push(this.posicaoInicial)
            this.posicaoInicial += 50;

        })

    desenhaCirculos(x, y, corBorda){

        this.pincel.strokeStyle = corBorda;
        this.pincel.beginPath();
        this.pincel.arc(x, y, this.tamanho, 0, 2 * Math.PI);
        this.pincel.fillStyle = "green";
        this.pincel.fill();
        this.pincel.stroke();
        //console.log(this.canvas);


    }

    criarCirculos(){

        for(let i = 0; i < this.itemSelecionado.length; i++){

            this.desenhaCirculos(this.canvas.x[i], this.canvas.valor[i], this.corNormal);


        }

    }

    desenharLinha(){
        this.itemSelecionado.forEach((number,index) => {

            //Linha de um ponto ao outro
            this.pincel.strokeStyle = this.corNormal;
            this.pincel.beginPath();
            this.pincel.moveTo(this.canvas.x[index],this.canvas.valor[index]);
            this.pincel.lineTo(this.canvas.x[index + 1], this.canvas.valor[index + 1]);
            this.pincel.stroke();

            //linha vertical

            this.pincel.beginPath();
            this.pincel.moveTo(this.canvas.x[index], 0);
            this.pincel.lineTo(this.canvas.x[index], 180);
            this.pincel.stroke(); 


        })
    }
}


eu coloco a informação dentro do array para desenhar o canvas, quando ele roda a primeira vez ele desenha perfeitamente, na hora de atualizar o canvas eu uso outro arquivo.

import Start from "./start.js"

export default class Comandos extends Start{

    constructor(pincel,tela){
        super(pincel,tela)


    }


    acrescentaValor(){
        console.log(this.canvas) <----- esse aqui ele retorna sem nada!!!

        let valor = this.valorSelecionado[this.indiceArray];
        if(this.valorSelecionado[this.indiceArray] < 120) {
            this.canvas.valor[this.indiceArray]  -= this.alteracaoCanvas;
        }    
        valor++
        this.valorSelecionado[this.indiceArray] = valor;
        if(this.valorSelecionado[this.indiceArray] >= 120) this.valorSelecionado[this.indiceArray] = 120;

        this.valorAtual.innerHTML = `${this.valorSelecionado[this.indiceArray]}%`;

        this.limpaTela();
        this.desenharLinha();
        this.criarCirculos();


    }

se eu dou um console.log ele me retorna o array sem nada, ai eu não consigo desenhar o canvas, se eu colocar um valor manualmente no array ele desenha normalmente, mas eu queria deixar de um jeito que não fica repetindo várias vezes a mesma coisa.. Se no arquivo index.js eu rodar a função que gera os valores do array depois rodar o de acrescentarValor ele me retorna nada no array, mas se logo em seguida der um console.log no index ele me retorna o array como deveria. Confesso que fiquei bem perdido aqui com isso.

5 respostas

Olá, Lucas, tudo bem?

Se os arrays da propriedade canvas continuam vazios quando você executa o código console.log(this.canvas) do método acrescentaValor(), então o problema deve estar no método updateArray(). Você deve se certificar de que esse método realmente está sendo executado antes (você pode colocar um console.log("teste") dentro dele), e caso ele esteja, verifique se ele está atualizando os arrays corretamente (executando console.log(this.canvas) logo após o forEach, ainda dentro do método updateArray()).

Me diz os resultados desses testes e se você conseguiu resolver o problema!

Obrigado pela sua resposta.

O array está sendo atualizado normalmente, mas quando eu tento fazer um console.log de dentro da função do acrescentaValor ele não está atualizado. Na verdade o que me parece é que todo o arquivo em que fica as funções de comando não atualiza com o loop do updateArray, se eu coloco um valor fixo dentro do array ele passa normalmente, parece que esse arquivo pega apenas as leituras dos array quando ele é criado!

Quando eu dou um console.log direto no arquivo ele me volta o array atualizado, mas se o console.log for feito no arquivos do comandos ele me volta zerado.

Olá, Lucas!

Você poderia upar seu projeto (no github, por exemplo) e compartilhar aqui o link para que eu possa simular o problema no meu computador?

Fico no aguardo.

https://github.com/lucasbertolini/FueltechDemo

O problema fica na pagina injecao.html

Olá, Lucas, tudo bem?

Vi aqui seu projeto. O problema é que no index.js você criou duas instâncias, uma para Start e outra para Comandos:

const inicio = new Start(pincel,tela);
const comandos = new Comandos(pincel,tela);
const inputHandler = new Input(pincel,tela);

inicio.iniciarNumero();
inicio.iniciarCirculos();
console.log(inicio.canvas)
inputHandler.iniciar();
console.log(comandos.canvas);

Dessa forma, a instância inicio terá seu próprio atributo canvas, e a instância comandos também terá seu próprio atributo canvas, independentes entre si. A instância inicio teve sua propriedade canvas configurada, mas a instância comandos não, por isso os resultados no console são diferentes.

Acredito que o ideal para você é ter uma única instância de objeto com a propriedade canvas. E se nessa mesma instância você quiser ter acesso aos métodos da classe Comandos, você só precisa da instância comandos. Afinal, como a classe Comandos herda da classe Start, uma instância de Comandos também terá acesso às propriedades e atributos definidos em Start.

Então o código acima ficará assim:

const comandos = new Comandos(pincel,tela);
const inputHandler = new Input(pincel,tela);

comandos.iniciarNumero();
comandos.iniciarCirculos();
console.log(comandos.canvas)
inputHandler.iniciar();
console.log(comandos.canvas);

Agora a saída no console fica assim:

Duas saídas iguais no console, imprimindo um objeto javascript com as propriedades "x", "valor", "posicaoInicial" e "alteracaoCanvas".

Mas se por enquanto você não precisar dos métodos definidos em Comandos, uma única instância de Start também servirá:

const inicio = new Start(pincel,tela);
const inputHandler = new Input(pincel,tela);

inicio.iniciarNumero();
inicio.iniciarCirculos();
console.log(inicio.canvas)
inputHandler.iniciar();
console.log(inicio.canvas);

A saída no console será a mesma.

Espero ter ajudado! Abraços e bons estudos :)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software