Saudações,
Tentei fazer a mesma coisa que foi aplicada à Lista de negociações na classe Mensagem e me deparei com algumas questões.
Quando faço:
this._mensagem = new Proxy(new Mensagem(), {
set(target, prop, value, receiver) {
if(prop == 'texto') {
return function() {
target[prop] = value;
self._mensagemView.update(target);
}
}
return Reflect.set(target, prop, value, receiver);
}
});
A função de retorno nunca é executada. Cheguei a inserir um console.log dentro do if e antes da função de retorno e este foi executado. Ou seja, quando o programa chega na linha da função de retorno, ele simplesmente retorna sem executar nada interno à ela. Esse comportamento não acontece com a implementação semelhante em ListaNegociações.
Tentando resolver o problema eu mudei o código para:
this._mensagem = new Proxy(new Mensagem(), {
set(target, prop, value, receiver) {
if(prop == 'texto') {
target[prop] = value;
self._mensagemView.update(target);
return;
}
return Reflect.set(target, prop, value, receiver);
}
});
Funcionou, contudo eu comecei a receber um erro no console "TypeError: 'set' on proxy: trap returned falsish for property 'texto'".
Resolvi novamente trocar a abordagem e fiz:
this._mensagem = new Proxy(new Mensagem(), {
set(target, prop, value, receiver) {
if(prop == 'texto') {
console.log(`interceptando`);
target[prop] = value;
self._mensagemView.update(target);
return function(){};
}
return Reflect.set(target, prop, value, receiver);
}
});
retornando agora uma função vazia, já que a primeira abordagem não dava este erro e também não executava o que havia na função. Funcionou perfeitamente e parou de dar erro. Por último, lendo o erro melhor, eu imaginei que a condição para não dar o erro era retornar verdadeiro, então fiz por fim :
this._mensagem = new Proxy(new Mensagem(), {
set(target, prop, value, receiver) {
if(prop == 'texto') {
console.log(`interceptando`);
target[prop] = value;
self._mensagemView.update(target);
return true;
}
return Reflect.set(target, prop, value, receiver);
}
});
O código passou a funcionar e o erro de retorno no console não voltou.
As dúvidas são: Por que, na primeira implementação, a função de retorno não estava sendo executada? O retorno de uma trap de proxy sempre tem que ser verdadeiro?