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

[Dúvida] Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'text'

Tenho o seguinte erro no console ao alterar o texto da classe Mensagem:

Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'text'
    at NegotiationController.add (NegotiationController.js:32:24)
    at HTMLFormElement.onsubmit (index.html:16:90)
add    @    NegotiationController.js:32
onsubmit    @    index.html:16

Porém não acontece nenhuma alteração na execução do código. Criação do Bind entre a classe e a view:

  #getMessageProxy (view) {
    const properties = ['text'];
    return new Bind(new Message(), view, properties);
  }

Este é o código da classe Bind:

class Bind {
  constructor (model, view, props) {
    view.update(model);

    return ProxyFactory.create(model, props, (model) => {
      view.update(model);
    });
  }
}

Este é o código da classe ProxyFactory:

class ProxyFactory {
  static create (object, props, action) {
    const proxyParams = {
      get (target, prop, receiver) {        
        if (ProxyFactory.#isFunction(target[prop]) && props.includes(prop)) {
          return function () {
            Reflect.apply(target[prop], target, arguments);

            return action(target);
          }
        }

        return Reflect.get(target, prop, receiver);
      },
      set (target, prop, value, receiver) {
        if (props.includes(prop)) {
            target[prop] = value;
            return action(target);
        }

        return Reflect.set(target, prop, value, receiver);
      }
    }

    return new Proxy(object, proxyParams);
  }

  static #isFunction (value) {
    return typeof(Function) === typeof(value);
  }
}
2 respostas
solução!

Olá Guilherme, tudo bem com você?

A mensagem de erro apresentada Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'text' pode está relacionada com o uso de atributos privados com o uso da tralha (#). Quando criamos atributos privados com o uso da tralha (#) a sintaxe dos parâmetros get e set da classe ProxyFactory deverão ser modificadas.

Peço que abra o arquivo services/ProxyFactory.js e localize o parâmetro get, ele deve ser declarado da seguinte forma, retornando target[prop]; no lugar de Reflect.get(target, prop, receiver); como apresentado abaixo:

get (target, prop, receiver) {        
    if (ProxyFactory.#isFunction(target[prop]) && props.includes(prop)) {
    return function () {
        Reflect.apply(target[prop], target, arguments);

        return action(target);
    }
    }

    return target[prop];
}

No parâmetro set a condicional if (props.includes(prop)) não irá retornar o action(target); e o parâmetro set deve retornar target[prop] = value; no lugar de Reflect.set(target, prop, value, receiver);, conforme apresentado abaixo:

set (target, prop, value, receiver) {
    if (props.includes(prop)) {
        target[prop] = value;
        action(target);
    }

    return target[prop] = value;
}

Feita as mudanças no arquivo ProxyFactory.js. Abra o arquivo index.html no navegador e adicione uma nova negociação. Verifique no console do painel de desenvolvedor (F12) se o erro é apresentado.

Código completo do arquivo ProxyFactory.js com as mudanças aplicadas

class ProxyFactory {
    static create (object, props, action) {
      const proxyParams = {
        get (target, prop, receiver) {        
          if (ProxyFactory.#isFunction(target[prop]) && props.includes(prop)) {
            return function () {
              Reflect.apply(target[prop], target, arguments);

              return action(target);
            }
          }

          return target[prop];
        },

        set (target, prop, value, receiver) {
            if (props.includes(prop)) {
                target[prop] = value;
                action(target);
            }

            return target[prop] = value;
        }

      }

      return new Proxy(object, proxyParams);
    }

    static #isFunction (value) {
      return typeof(Function) === typeof(value);
    }
  }

Espero ter lhe ajudado. Em caso de dúvidas estou à disposição.

Não hesite em voltar ao fórum para continuar aprendendo e interagindo com a comunidade.

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Então, Felippe, acho que era apenas cache. Após alguns empty cache and hard reload tudo normalizou. Marquei tua resposta como solução pois alguém pode ter um problema similar e utilizá-la. Agradeço a atenção.