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

Mensagem sendo mostrada apenas após a primeira inserção

Prestando um pouco de atenção no video, pude reparar que a mensagem de "Negociação adicionada com sucesso" apareceu apenas depois que uma negociação já foi adicionada (aula: Nosso proxy ainda não está 100%!, momento: 5:29).

Por quê?

5 respostas

Porque faltou uma instrução que eu coloco mais a frente. Como isso gerou dúvida, no mesmo vídeo pedi para que a equipe de edição incluísse a instrução que estava faltando antecipadamente, inclusive com uma seta indicando o local onde ela deve ser inserida.

https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-2/task/17491

Veja no minuto 2.:48.

Desculpe qualquer transtorno que isso possa ter causado.

solução!

Pessoal,

Não precisei adicionar a instrução que faltou e que foi acrescentado depois, apenas troquei a lógica e funcionou, vejam:

class ProxyFactory {

    static create(objeto, props, acao) {
        return new Proxy(objeto, {

            get (target, prop, receiver) {
                if (props.includes(prop) && typeof(target[prop]) == typeof(Function)) {
                    return function() {
                        Reflect.apply(target[prop], target, arguments);
                        return acao(target);
                    }
                }

                return Reflect.get(target, prop, receiver);
            },

            set(target, prop, value, receiver) {
                let retorno = Reflect.set(target, prop, value, receiver);
                if (props.includes(prop)) {
                    acao(target);
                }

                return retorno;
            }
        });
    }
}

Penso que dessa forma está até mais correto, pois a ação somente deve ser executada após o set da proxy no target.

O que acham?

Pablo, parabéns pela implementação. Acho que sua sacada foi mais interessante que a apresentada no curso, visto que no curso você acaba realizando a mesma operação (set) duas vezes:

set(target, prop, value, receiver) {

    if(props.includes(prop) {

// Seta valor para a propriedade interceptada
        target[prop] = value;
        acao(target);
    })

// Novamente seta valor para a propriedade interceptada
    return Reflect.set(target, prop, value, receiver);
}

Sim

Para entender melhor, oque aconteceu no vídeo é que o método _mensagemView(model) =>acao(target) é chamado antes da função mensage.texto = valor => Reflect.set(...)

A lógica do Pablo Medeiros resolve. Pois o método que atualiza foi executado após a mudança de atribuição

Outro detalhe é que o método set de um objeto espera um boolean para realizar a atribuição. Corrigindo type error on "set"

Se preferir seguir como está no video é preciso alterar de "target(prop) = value" para "target[prop] = value"