3
respostas

A menssagem nunca é exibida.

A menssagem nunca é exibida. Mesmo antes de adicionar a instrução "target[prop] = value;"(que com outros alunos, exibia a menssagem apenas a partir da segunda negociação adicionada).

Procurei o problema, mas não encontrei. Não tenho muita prática com o vscode então não consegui fazer debug. Recomendações de vídeos, blogs, ou outros envolvendo debug no vscode são muito bem vindas.

Vlw.

Segue abaixo classes envolvidas:

class NegociacaoController {
  constructor() {
    let $ = document.querySelector.bind(document);

    this._inputData = $("#data");
    this._inputQuantidade = $("#quantidade");
    this._inputValor = $("#valor");

    this._listaNegociacoes = ProxyFactory.create(
      new ListaNegociacoes(),
      ["adiciona", "esvazia"],
      (model) => {
        this._negociacoesView.update(model);
      }
    );
    this._negociacoesView = new NegociacoesView($("#negociacoes-view"));
    this._negociacoesView.update(this._listaNegociacoes);

    this._menssagem = new ProxyFactory(new Menssagem(), ["texto"], (model) =>
      this._menssagemView.update(model)
    );
    this._menssagemView = new MenssagemView($("#menssagem-view"));
    this._menssagemView.update(this._menssagem);
  }

  _criaNegociacao() {
    return new Negociacao(
      this._inputData.value,
      this._inputQuantidade.value,
      this._inputValor.value
    );
  }

  _limpaFormulario() {
    this._inputData.value = "";
    this._inputQuantidade.value = "1";
    this._inputValor.value = "0";
    this._inputData.focus();
  }

  adiciona(event) {
    event.preventDefault();

    this._listaNegociacoes.adiciona(this._criaNegociacao());
    this._menssagem.texto = "Negociação cadastrada com sucesso.";
    this._limpaFormulario();
  }

  apaga() {
    this._listaNegociacoes.esvazia();

    this._menssagem.texto = "Negociações apagadas com sucesso.";
  }
}
class ProxyFactory {
  static create(obj, props, action) {
    return new Proxy(obj, {
      get: function (target, prop, receiver) {
        if (props.includes(prop) && ProxyFactory._isFunction(target[prop])) {
          return function () {
            console.log(`Interceptando ${prop}`);
            Reflect.apply(target[prop], target, arguments);
            return action(target);
          };
        }
        return Reflect.get(target, prop, receiver);
      },
      set: function (target, prop, value, receiver) {
        console.log("passando pelo set");
        if (props.includes(prop)) {
          console.log(`Interceptando ${prop}`);
          target[prop] = value;
          action(target);
        }
        return Reflect.set(target, prop, value, receiver);
      },
    });
  }

  static _isFunction(func) {
    return typeof func == typeof Function;
  }
}
class Menssagem {
    constructor(texto = "") {
        this._texto = texto;
    }

    get texto() {
        return this._texto;
    }

    set texto(texto) {
        this._texto = texto;
    }
}

Link para projeto: https://drive.google.com/file/d/1ANdFyS5B-4rkq_YUS1hgOjO8Y35WVz2a/view?usp=sharing

3 respostas

Fala ai Luan, tudo bem? Esse problema pode estar ocorrendo por N motivos, é um pouco complicado saber apenas olhando os códigos.

Consegue compartilhar o projeto? Assim eu consigo simular o problema por aqui e analisá-lo com mais calma.

Pode compartilhar através do Github ou Google Drive (zipado).

Fico no aguardo.

Fala ai Luan, dei uma olhada nos códigos, o problema está na criação da this._menssagem, no caso essa linha:

this._menssagem = new ProxyFactory(new Menssagem(), ["texto"], (model) =>
    this._menssagemView.update(model)
);

Isso dentro da classe NegociacaoController, o problema é que a classe ProxyFactory não tem nada definido no construtor, ela possuí uma função estática chamada create, ficando:

this._menssagem = ProxyFactory.create(new Menssagem(), ["texto"], (model) =>
    this._menssagemView.update(model)
);

Além de usar a função create também é necessário remover a keyword new.

Espero ter ajudado.