¿Cómo retirar correctamente los componentes?
He probado a llamar al método 'setSelected' antes de eliminar componentes, ¡funciona! Aquí está el código actualizado: '''javascript Comando: Combinar las celdas editor. Commands.add('table:table-cells-combine', editor => { const em = editor.getModel() componentes const = editor.getSelectedAll() Conserva el primer com...
Lee la respuesta completa abajo ↓Pregunta
Quiero eliminar los componentes de forma programática, lo siguiente es mi fragmento de código. '''javascript Comando const = editor. Commands.get('select-comp') editor. Commands.extend('select-comp', { Sobrescribe este método privado para que la barra de herramientas se muestre condicionalmente. updateToolbar(mod) { const em = this.config.em const model = mod == em ? em.getSelected() : mod si (modelo) { const toolbar = model.get('__toolbar') || model.get('barra de herramientas') const filtered = toolbar.filter(item => item.isDisponible === indefinido || item.isAvailable.call(this, em)) model.has('__toolbar') || model.set('__toolbar', barra de herramientas) model.set('toolbar', filtrado) } Command.updateToolbar.call(this, mod) } })
====== ↓ Eliminar lógica ↓ ====== Comando: Combinar las celdas editor. Commands.add('table:table-cells-combine', editor => { const em = editor.getModel() componentes const = editor.getSelectedAll() Elige la primera opción seleccionada como celda primaria. Componente const = componentes[0] Conserva este componente, pero elimina otros seleccionados. components.slice(1, components.length).forEach(item => item.remove()) Actualizar los atributos const [rowspan, colspan] = component.get('__span') || [] component.setAttributes({rowspan, colspan}) em.setSelected(component) })
Extiende los elementos de la barra de herramientas de celdas. editor. DomComponents.addType('cell', { extendFn: ['initToolbar'], modelo: { initToolbar() { Modelo const = esto var TB = [... model.get('toolbar') || []]
Herramienta: combinar las celdas. tb.push({ Atributos: { Clase: 'FA FA-CUADRADO' }, comando: ed => ed.runCommand('table:table-cells-combine'), isAvailable (ed) { componentes const = ed.getSelectedAll() components.forEach(component => component.unset('__span')) si (components.length > 1) { const [ tl, br ] = componentes .reduce((r, comp) => { const [ tl, br ] = r const parent = comp.parent() si (padre) { ====== ↓ Problema ↓ ====== El padre puede estar indefinido, por ejemplo: el componente se eliminó antes del comando deshacer (Ctrl + Z). const rowIndex = parent.index() const columnIndex = comp.index() tl[0] < rowIndex || (tl[0] = índiceFilas) tl[1] < columnIndex || (tl[1] = columnIndex) br[0] > rowIndex || (br[0] = rowIndex) br[1] > columnIndex || (br[1] = columnIndex) } retorno r }, [[], []]) Envergadura const = br[0] - tl[0] + 1 const colspan = br[1] - tl[1] + 1 const seleccionado = componentes[0] selected.set('__span', [rowspan, colspan]) return components.length === colspan * rowspan } return false } }) model.set('toolbar', tb) } } })
Después de eliminar los componentes, deshacer las acciones de eliminación (Ctrl + Z), hacer las múltiples selecciones con la tecla shift obtendrá el error 'Uncaught TypeError: No puede leer la propiedad 'indexOf' de undefined'.
! [{0B88A939-BEF8-46ED-83F8-21D6AFD32D88}_20190531185100](https://user-images.githubusercontent.com/11482264/58701807-8ccd1000-83d6-11e9-8127-c667a865679c.jpg)
Mi pregunta es: ¿Cómo eliminar correctamente los componentes?
Respuestas (3)
He probado a llamar al método 'setSelected' antes de eliminar componentes, ¡funciona! Aquí está el código actualizado:
'''javascript Comando: Combinar las celdas editor. Commands.add('table:table-cells-combine', editor => { const em = editor.getModel() componentes const = editor.getSelectedAll() Conserva el primer componente seleccionado, pero elimina los demás. Componente const = componentes[0] const otros = components.slice(1, components.length) Actualizar los atributos const [rowspan, colspan] = component.get('__span') || [] component.setAttributes({rowspan, colspan}) Restablece el estado de selección antes de retirar otros componentes. em.setSelected(component) Quita los componentes, las siguientes dos formas funcionan en ambas ocasiones. const parent = component.parent() padre.components(component.collection.filter(comp => !others.includes(comp))) others.forEach(item => item.remove()) })
@joselin bizmatesph No lo he estado tocando en 3 años, pero supongo que es similar al caso que tuve. Por la instantánea que publicaste, parece que eliminaste los componentes incorrectos y puede que tengas que comprobar el rowspan y el colspan del componente guardado.
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #924
[Bug]: llamar al comando 'preview' no funciona correctamente
Este es un fragmento de código que estoy usando: ' this.editor = grapesjs.init(this.config)' 'const commandManager = this.editor.Commands'...
Issue #3541
[PREGUNTA] ¿Cuál es la forma idiomática de añadir y eliminar clases de los componentes?
Hola 👋 ¡Me encanta el editor! Estamos usando rasgos para modificar las clases que tiene un componente, pero eso resulta un poco forzado po...
Issue #2961
BUG: Los componentes en modal personalizado no son editables
Hola, estoy intentando añadir un bloque modal personalizado a mi proyecto y quiero cambiar el contenido de este modal también con arrastrar...
Issue #2012
[pregunta] cómo añadir un script para todos los widgets (como protectedCss)
Quiero añadir algunas funciones para todos los componentes accesibles. al inicializar el editor, hay una opción como protectedCss. ¿No hay...
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 →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.