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ê?
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ê?
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.
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"