Issue #4576💬 RespondidoAbierto el 12 de septiembre de 2022por benryanwilliamsReacciones 1

Al hacer clic en 'envolver para estilo' afecta los componentes internos de otros componentes dentro del mismo cuadro de texto

Respuesta rápidapor artf1

RTE depende del contenido del DOM durante la edición, así que si lo eliminas deliberadamente con algo como '''js onRender() { this.el.innerHTML = this.model.get("displayedText") }, ``` Los componentes interiores se eliminarán una vez terminada la edición.

Lee la respuesta completa abajo ↓

Pregunta

Versión GrapesJS

  • Confirmo que se debe usar la última versión de GrapesJS

¿Qué navegador usas?

Chrome 104.0.5112.101

Enlace de demo reproducible

https://jsfiddle.net/7cLr0xt2/3/

Describe el bicho

¿Cómo reproducir el bicho? Por alguna razón no puedo reproducir el error dentro del fiddle enlazado arriba, ya que la línea 34 'selectedComponent.components('<span liquid="if contact.id">jhbjhhgjjh</span> <span liquid="else">qwewqeqwe</span>')' no reemplaza los componentes internos del componente, así que tendré que compartir un vídeo de lo que ocurre con mi proyecto, pero los pasos son los siguientes:

  1. Haz doble clic en 'Hola Mundo!! 'cuadro de texto y seleccionar la palabra 'Mundo'
  2. Haz clic en el botón de pincel en el editor RTE para envolver esa palabra para estilismo
  3. Haz clic en el botón 'si' rodeado en el extremo izquierdo de la barra de componentes y haz clic en 'ok' en el diálogo que aparece para convertir esto en un componente de 'texto condicional'
  4. Haz doble clic en el nuevo componente 'Abrir condicionales para elegir' (normalmente esto abriría un diálogo, pero he simplificado para este error, así que ahora solo aplica información ficticia al componente, incluyendo añadir un atributo y cambiar los componentes internos del componente). Cambiar los componentes interiores no funciona en este instrumento, no sé por qué)
  5. Haz clic en el botón 'ver código' para ver los cambios que esto ha hecho en el código; como puedes ver, ha insertado el atributo 'liquidtag="if', pero los componentes internos no aparecen. En mi proyecto, los componentes internos de este span serían '<span liquid="if contact.id">jhbjhhgjjh</span> <span liquid="else">qwewqeqwe</span>'
  6. Cierra el cuadro de diálogo 'ver código' y haz doble clic en la palabra 'Hola' para seleccionarla
  7. Haz clic en el botón del pincel en el editor RTE para envolver esa palabra para el estilo
  8. Haz clic de nuevo en el botón 'ver código': en mi proyecto, los componentes internos (es decir, '<span liquid="if contact.id">jhbjhhgjh</span> <span liquid="else">qwewqeqwe</span>') del primer componente que creamos en el paso (4) ahora desaparecen (aunque los atributos permanecen)

¿Cuál es el comportamiento esperado? Envolver una palabra para estilizar no debería cambiar los componentes internos de otros componentes de esa div. Presumiblemente esto se debe a cómo funciona el 'wrap for style'; quizás establece el HTML interno de ese componente igual que el HTML interno de la vista del componente.

¿Cuál es el comportamiento actual? Los componentes internos '<span liquid="if contact.id">jhbjhhgjjh</span> <span liquid="else">qwewqeqwe</span>' establecidos en el paso 5 desaparecen y se reemplazan por la propiedad 'displayedText' cuando otra palabra del cuadro de texto original se envuelve para el estilo. Creo que podría tener que ver con las líneas 85 - 87 en el violín, pero hasta donde entiendo esto solo debería afectar a la vista y, por tanto, a cómo aparece dentro del lienzo, no al HTML subyacente del componente.

Aquí tienes un vídeo que muestra lo que ocurre en mi proyecto:

https://user-images.githubusercontent.com/67364267/189606601-2f7b280e-8436-459f-8951-c55337123216.mov

Código de conducta

  • Acepto seguir el Código de Conducta de este proyecto

Respuestas (4)

artf13 de septiembre de 2022

RTE depende del contenido del DOM durante la edición, así que si lo eliminas deliberadamente con algo como '''js onRender() { this.el.innerHTML = this.model.get("displayedText") },

Los componentes interiores se eliminarán una vez terminada la edición.
benryanwilliams13 de septiembre de 2022

Vale, gracias @artf, tiene sentido.

Sin embargo, esas líneas de código, junto con

init() {
        this.listenTo(this.model, "change:displayedText", this.render)
      },

se requiere renderizar el estado seleccionado correcto dentro del lienzo de la siguiente manera (tanto al renderizar inicialmente el componente como cuando el usuario selecciona un estado 'if' diferente, cambiando así 'displayedText'):

https://user-images.githubusercontent.com/67364267/189854125-9544d34b-2f71-4b0c-872e-dbdfb2232fd9.mov

¿Se te ocurre alguna forma de conservar los componentes internos después de editar mediante RTE? ¿Quizá podría almacenar estos componentes internos dentro de una propiedad del propio componente 'texto-condicional' y asignarlos también durante 'onRender()'? Si eso es posible, ¿cómo puedo establecer la propiedad 'components' del componente dentro del gancho 'onRender()'?

¡Gracias por tu ayuda!

benryanwilliams13 de septiembre de 2022

Necesito hacer más pruebas, pero parece que he solucionado este comportamiento guardando los componentes internos dentro del propio componente al crearlo o editarlo, y luego usar el gancho 'rte:disable' de la siguiente manera:

editor.on('rte:disable', () => { 
          const conditionalComponents = (editor.getSelected().components().filter((component) => {
            return component.attributes.type == 'texto-condicional'
          }))

conditionalComponents.forEach((component) => {
            component.components(component.attributes.conditionCode)
          })
});

Parece un poco improvisado, así que si se te ocurre una forma mejor, por favor házmelo saber.

ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @benryanwilliams.

Buena pregunta sobre Hacer clic en el botón 'envolver para estilo' afecta a los componentes internos de otros componentes dentro del mismo cuadro de texto. El enfoque recomendado con ProseMirror es usar la API orientada a eventos.

Empieza aquí:

  1. Consulta la documentación de GrapesJS de tu módulo específico
  2. Busca el método del oyente de eventos 'on()'
  3. La mayoría de las operaciones se pueden realizar escuchando eventos del editor y de los componentes

Patrones comunes: '''javascript Prestad atención a los cambios editor.on('Change', () => console.log('Something Changed'));

Ciclo de vida de los componentes editor.on('component:mount', (c) => console.log('component ready', c)); editor.on('component:update', (c) => console.log('component updated', c));


**Si sigues atascado:**
- Compartir una reproducción mínima de CodeSandbox
- Incluye lo que ya has probado
- Menciona tu versión GrapesJS
- ¡La comunidad está aquí para ayudar!

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.