Issue #639✓ ResueltoAbierto el 14 de diciembre de 2017por z1lkReacciones 6

Rerenderizar el componente en Canvas cuando el nombre de la etiqueta ha cambiado

Respuesta rápidapor artf5

@z1lk ya he añadido algo así para la próxima versión '''js Modelo Dentro de Init this.listenTo(this, 'change:tagName', this.tagUpdated); // ... tagUpdated() { const coll = this.collection; const at = coll.indexOf(this); col.remove(this); coll.add(esto, { at }); }, ```

Lee la respuesta completa abajo ↓

Pregunta

Estoy intentando construir un componente básico de encabezado que te permita seleccionar de H1 a H6 con un rasgo. Pero cuando se selecciona una opción, el lienzo no se actualiza. El cambio es visible en la vista de código, y si muevo el elemento en el lienzo con la herramienta de arrastre, la etiqueta cambia. He estado leyendo la documentación de la API así como el código fuente, pero no puedo hacer que el componente se vuelva a renderizar automáticamente. Sospecho que Grapes no está escuchando un cambio en el nombre de la etiqueta del componente. ¿Cuál es la forma adecuada de forzar una re-renderización en este caso?

'''js VAR Comps = Editor. DomComponents; Bloqueos VAR = editor. Jefe de bloque; var textType = comps.getType('text'); var textModel = textType.model; var textView = textType.view;

comps.addType('header', { model: textModel.extend({ defaults: Object.assign({}, textModel.prototype.defaults, { 'nombre personalizado': 'Cabecera', etiquetaNombre: 'h1', Rasgos: [ { tipo: 'select', Opciones: [ {valor: 'h1', nombre: 'Uno (el más grande)'}, {valor: 'h2', nombre: 'Dos' }, {valor: 'h3', nombre: 'Three '}, {valor: 'h4', nombre: 'Cuatro '}, {valor: 'h5', nombre: 'Five '}, {valor: 'h6', nombre: 'Seis (el más pequeño)'}, ], etiqueta: 'Tamaño', Nombre: 'tamaño de cabecera', cambioprop: 1 } ] }),

init() { this.listenTo(this, 'change:header-size', this.changeTagName); },

changeTagName() { view.tagName es un archivo que devuelve model.tagName this.set('tagName', this.get('tamaño de cabecera')); }

}, { isComponent: function(el) { if(el && ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(el.tagName)) { return {type: 'header'}; } } }), ver: textoVer });

blocks.add('header', { etiqueta: 'Cabezal', categoría: 'Básico', atributos: {clase:'fa fa-cabecera'}, Contenido: { tipo:'encabezado', contenido: 'Inserta aquí el texto de tu cabecera', activeOnRender: 1 } });

Respuestas (3)

👍 Muy útilartf14 de diciembre de 2017

@z1lk ya he añadido algo así para la próxima versión '''js Modelo Dentro de Init this.listenTo(this, 'change:tagName', this.tagUpdated); // ... tagUpdated() { const coll = this.collection; const at = coll.indexOf(this); col.remove(this); coll.add(esto, { at }); },

z1lk20 de diciembre de 2017

No estoy seguro de por qué 'el' sería una cadena, pero mira el commit que cerró el problema: https://github.com/artf/grapesjs/commit/e450cb98855d16ad819f1214350825a50e45e910

Si usas la última versión de Grapes, el Componente escucha el cambio de 'tagName' y hace el reemplazo del nodo él mismo. Así que deberías poder eliminar las funciones 'init' y 'tagUpdated'. El rasgo se actualizará con 'NombreEtiqueta' y el Componente hará el resto.

Edito:

Otra cosa que se me ocurrió es: a veces el objeto que se pasa a 'isComponent' no tiene el método que llamo, y en ese caso aparece un error. Podrías hacer primero una revisión de seguridad: '''js if(el && el.tagName && ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'].includes(el.tagName)) { ...

artf14 de diciembre de 2017

Sí, esto es porque no puedes cambiar el nombre de la etiqueta de un elemento DOM existente. Probablemente la solución sería, al cambiar 'NombreEtiqueta', eliminar y reemplazar el nodo (en la misma posición)

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.