Los Nodos de Texto interfieren al cambiar el contenido en un elemento
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)
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)'
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!
No creo que necesites este 'target.set('content', value);'. Por lo demás, todo bien 👍
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:
- Un ejemplo mínimo reproducible (CodeSandbox/JSFiddle)
- Tu GrapesJS número de versión
- Información sobre navegador y sistema operativo
- Cualquier mensaje de error de la consola del navegador
- 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.
Issue #3213
Cómo guardar los rasgos añadidos dinámicamente
Hola @artf, tengo un componente personalizado que tiene un rasgo de botón. Cuando se pulsa el botón, añado dinámicamente un rasgo personali...
Issue #3732
El tipo de componente de comentario no soporta añadir rasgos
Estoy trabajando en un script que añade un rasgo a todos los tipos de componente, pero el tipo de comentario no tiene el objeto prototipo....
Issue #3546
¿Cómo puedo añadir la barra de herramientas personalizada izquierda para el componente Imagen, similar a texto?
Queremos añadir una barra de herramientas personalizada al componente de imagen que se mostrará a la izquierda (similar a lo que mostramos...
Issue #3507
Sin ID generado y sin ID de selección automática
Hola a todos, Estoy usando grapesjs-blocks-bootstrap4 y reviso cómo componen los componentes, se ve bien. Pero cuando seleccionas contenedo...
Plugins de pago que cumplen con este problema
Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.
Cargando recomendaciones de plugins de pago...
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 →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.
Tutorial
Ship to Production Faster: What’s New in GrapesJS Shadcn
Supercharge your page builder! GrapesJS Shadcn adds live drag previews, rich text / commands, dynamic data, and canvas presets to ship to prod faster.
Tutorial
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
Embed GrapesJS in Your SaaS: A Weekend Guide
Embed GrapesJS in your SaaS and ship a white-label page builder over a weekend. Honest tradeoffs, real code, and the plugins that close the UX gap.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.