2
respostas

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

2 respostas

Ficou faltando chamar o update da view nas funções adiciona() e apaga().

this._menssagemView.update(this._menssagem);

Leandro Bertino Grimaldi: Ficou faltando chamar o update da view nas funções adiciona() e apaga(). this.menssagemView.update(this.menssagem);

Mas o ProxyFactory.js foi criado para automatizar o update() tanto de MenssagemView.js. Ao fazer a atribuição de um novo valor para "this._menssagem", deveria cair na trap do set da ProxyFactory. O problema é que mesmo fazendo essa atribuição, a execução nunca chega nesse set(testei isso usando um console.log() ).