Issue #3309💬 RespondidoAbierto el 4 de marzo de 2021por jcamejoReacciones 0

Los Nodos de Texto interfieren al cambiar el contenido en un elemento

Respuesta rápidapor artf

Hola Juan, gracias por el informe, ¿puedes mostrarme cómo funciona tu rasgo de texto? Esperaría que funcionara correctamente si actualizas tu componente de esta manera: 'component.components(e.target.value)'

Lee la respuesta completa abajo ↓

Pregunta

Versión: 0.16.44

Hola @artf

Tengo un bloque personalizado con un componente de botón personalizado, cuyo contenido es similar al de este. ` <a data-gjs-type="custom_button" class="btn btn-1" href="">Haz clic aquí</a>'

Además, he añadido un rasgo de texto para cambiar el contenido de los botones, en este caso concreto no quiero usar el editor RTE. <img width="286" alt="image" src="https://user-images.githubusercontent.com/1976679/109966677-d3a91180-7cf0-11eb-8463-e28b8de806c2.png">

Cuando cambio el valor, la primera vez se refleja correctamente <img width="975" alt="image" src="https://user-images.githubusercontent.com/1976679/109967201-6c3f9180-7cf1-11eb-943e-0c96e8693845.png">

Pero cuando guardo y vuelvo a cargar la página, vuelve a su valor original <img width="967" alt="image" src="https://user-images.githubusercontent.com/1976679/109967439-b6287780-7cf1-11eb-8c81-053458c1dc38.png">

Esto ocurre en la función updateContent de la vista de componentes, el componente comprueba si tiene hijos; en ese caso, el componente no renderiza el contenido, el elemento tiene hijos, pero son nodos de texto.

Además, si configuras el contenido de antemano como un atributo de configuración de componentes, hace esto.

<img width="972" alt="image" src="https://user-images.githubusercontent.com/1976679/109968113-9180cf80-7cf2-11eb-9d5a-961d0fe78237.png">

La función toHtml del modelo Component imprime primero el contenido y luego sus hijos (los nodos de texto).

En mi caso, lo he solucionado sobrescribiendo las funciones renderChildren y toHtml en la vista y modelo de mi componente personalizado, además de eliminar directamente el texto por defecto de la etiqueta y añadirlo solo a la configuración del componente. Escribo esto porque quizá el caso vaya más allá de mi situación particular y pueda causar otros problemas.

Por lo que he visto, los nodos de texto son un poco complicados de manejar. Cuando tenga algo de tiempo podré volver a esto y ofrecer un

Respuestas (4)

artf10 de marzo de 2021

Hola Juan, gracias por el informe, ¿puedes mostrarme cómo funciona tu rasgo de texto? Esperaría que funcionara correctamente si actualizas tu componente de esta manera: 'component.components(e.target.value)'

jcamejo11 de marzo de 2021

Esa era mi característica

 tm.addType('content', {
    eventos: {
      'cambio': 'onValueChange'
    },
    getInputEl: function() {
      this.inputEl = document.createElement('input');
      this.inputEl.value = this.getModelValue();
      return this.inputEl;
    },
    getModelValue: function() {
      const { model, target } = this;
      var value = target.get('content') || target.getEl().textContent;
      return value;
    },
    onValueChange: function() {
      const { model, target } = this;
      var value = this.inputEl.value;
      target.set('content', value);
      target.getEl().textContent = valor;
    },
    onUpdate: function() {
      var value = this.getModelValue();
      this.target.getEl().textContent = valor;
    }
  });

Lo he cambiado a

tm.addType('content', {
   eventos: {
     'cambio': 'onValueChange'
   },
   getInputEl: function() {
     this.inputEl = document.createElement('input');
     this.inputEl.value = this.getModelValue();
     return this.inputEl;
   },
   getModelValue: function() {
     const { model, target } = this;
     var value = target.get('content') || target.getEl().textContent;
     return value;
   },
   onValueChange: function() {
     const { model, target } = this;
     var value = this.inputEl.value;
     target.set('content', value);
     objetivo.componentes(valor);
   },
   onUpdate: function() {
     var value = this.getModelValue();
     this.target.getEl().textContent = valor;
   }
 });

Y ahora funciona sin anular contenido de actualización ni renderizar niños, ¡gracias! Nunca habría llegado a la conclusión de usar el método de 'componentes'. Ahora no me gustan los nodos 😅 de texto

Creo que podemos cerrar este problema a menos que haya algún otro punto que quieras añadir para mejorar.

¡Gracias!

artf21 de marzo de 2021

No creo que necesites este 'target.set('content', value);'. Por lo demás, todo bien 👍

ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @jcamejo.

Gracias por compartir tu informe sobre los nodos de texto interfieren al cambiar contenido en element. Para ayudar al equipo a investigar y priorizar esto:

Por favor, proporciona:

  1. Un ejemplo mínimo reproducible (CodeSandbox/JSFiddle)
  2. Tu GrapesJS número de versión
  3. Información sobre navegador y sistema operativo
  4. Cualquier mensaje de error de la consola del navegador
  5. Pasos para reproducir el problema

Lo que más ayuda:

  • Ejemplo de código mínimo (no tu proyecto completo)
  • Grabación de pantalla o captura de pantalla que muestra el problema
  • Comportamiento esperado frente a comportamiento real claramente indicado
  • Configuración GrapesJS que estás usando

Con estos detalles, los mantenedores pueden identificar y priorizar una solución mucho más rápido. El equipo de GrapesJS responde muy bien a los problemas bien documentados.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Tutoriales relacionados

Guías detalladas sobre el mismo tema.

Todos los tutoriales →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.