Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Uncaught TypeError: Cannot read property 'update' of undefined

Estou recebendo este erro e a mensagem de notificação não aparece lá em cima...

class ProxyFactory {
    static create(objeto, props, acao) {
        return new Proxy(objeto, {
            get(target, prop, receiver){
                if(props.includes(prop) && ProxyFactory._ehFuncao(target[prop])){
                    return function () {
                        console.log(`metodo '${prop}' interceptado`);
                        Reflect.apply(target[prop], target, arguments);
                        return acao(target);
                    }
                }
                return Reflect.get(target,prop,receiver);
            },
            set(target, prop, value, receiver) {
                    if(props.includes(prop)) {
                             target[prop] = value;
                             acao(target); ->O ERRO ACONTECE AQUI!
                    }
                    return Reflect.set(target, prop, value, receiver);
            }
        });
    }

    static _ehFuncao(func){
        return typeof(func) == typeof(Function);
    }

}

Sobre o erro: Uncaught TypeError: Cannot read property 'update' of undefined at NegociacaoController._mensagem.ProxyFactory.create.mensagem (NegociacaoController.js:24) at Object.set (ProxyFactory.js:25) at NegociacaoController.adiciona (NegociacaoController.js:33) at HTMLFormElement.onsubmit (index.html:16)

3 respostas

Compartilhe o código do controller.

class NegociacaoController {

    constructor() { //fazer isso pra evitar percorrer o DOM inumeras vezes, desse jeito percorre só uma
        let $ = document.querySelector.bind(document); //bind serve pra manter o querySelector associado ao document., se não fizer isso, ele não funciona
        this._inputData = $('#data'); //aceita seletor css
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');


        //USANDO A LISTA A PARTIR DO Proxy
        //let self = this._listaNegociacoes;
        this._listaNegociacoes = ProxyFactory.create(
            new ListaNegociacoes(), //objeto
            ['adiciona', 'esvazia'], //props
            (lista) => this._negociacoesView.update(lista) //acao, posso usar o self recebendo o this de this._listaNegociacoes ou apenas LISTA que irá se referir ao this._listaNegociacoes
        );
        this._negociacoesView = new NegociacoesView($('#negociacoesView'));
        this._negociacoesView.update(this._listaNegociacoes);


        this._mensagem = ProxyFactory.create(
            new Mensagem(),
            ['texto'],
            mensagem => this.mensagemView.update(mensagem)
        );
        this._mensagemView = new MensagemView($('#mensagemView'));
        this._mensagemView.update(this._mensagem);
    }
    adiciona(event) {
        event.preventDefault();

        this._listaNegociacoes.adiciona(this._criaNegociacao());
        this._mensagem.texto = 'Negociacao adicionada com sucesso!';
        this._mensagemView.update(this._mensagem);

        this._limpaFormulario();
        console.log(this._listaNegociacoes.negociacoes);


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

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

         this._mensagem.texto = 'Negociacoes Apagadas com Sucesso';
         this._mensagemView.update(this._mensagem);
     }

    _limpaFormulario(){ // tem o _ para apenas a classe negociacaoController acessar
        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;

        this._inputData.focus();
    }
}
solução!

Achei o erro, Flavio! Foi só jogar o código aqui e dar uma refrescada na vista que encontrei o erro em:

        this._mensagem = ProxyFactory.create(
            new Mensagem(),
            ['texto'],
            mensagem => this._mensagemView.update(mensagem)
        );

Não tinha colocado o underline para acessar mensagemView.update. Erro de atenção! Muito Obrigado!