Los componentes de texto no se comportan correctamente después de crear componentes personalizados
Estás mezclando la API antigua con la nueva para la definición de componentes personalizados. Con 'model: defaultModel.extend({' se requería un 'isComponent' interno estático (estás usando uno externo, como en la nueva API) y sin él, estás rompiendo la Pila de Tipos de Component Deberías simplemente cambiar 'model: de...
Lee la respuesta completa abajo ↓Pregunta
Hola artf,
Después de crear componentes personalizados, el componente de texto no se comporta como antes. Elimina todos los nodos desnudos después de cambiar algún código en modo importación. Por ejemplo
<div>Inserta tu texto
<a data-cke-saved-href="http://abc" href="http://abc">aquí</a>
</div>
Después de editar algo en importación modal, se cambia a:
<div>
<a data-cke-saved-href="http://abc" href="http://abc">aquí</a>
</div>
Como puedes ver, eliminó el nodo de texto desnudo, es decir, Inserta tu texto. Cabe señalar que este comportamiento no ocurre cuando no se añade ningún componente personalizado al editor.
Un ejemplo de componente personalizado que creé:
export const NavbarMenu = editor => {
var defaultType = editor. DomComponents.getType("default");
var defaultModel = defaultType.model;
editor. DomComponents.addType('menu-nav', {
isComponent: el => el.tagName === 'menu-nav',
model: defaultModel.extend({
Extender propiedades predeterminadas
defaults: Object.assign({}, defaultModel.prototype.defaults, {
etiquetaNombre: 'menu-nav',
removible: cierto,
copiable: falso,
Droppable: falso,
redimensionable: falso,
editable: false,
Rasgos: [
{
Tipo: 'texto',
nombre: 'menuName',
etiqueta: 'Nombre del menú'
}
],
atributos: {
'menuName': 'Navegación de cabecera'
},
propagar: ['removible', 'droppable', 'copiable', 'editable'],
Componentes: '
<div data-gjs-selectable="false" class="container-fluid bg-menu">
<div class="row" data-gjs-selectable="false">
<div class="col-lg-12" data-gjs-selectable="false">
<div class="main-nav-center" data-gjs-selectable="false">
<nav id="main-nav" class="prvidr-navbar-menu text-center" data-gjs-selectable="false">
<ul id="main-menu" class="sm pixelstrap sm-horizontal-catch-menu" data-gjs-selectable="false">
<li data-gjs-selectable="false">
<a data-gjs-selectable="false" href="javascript:void(0)">
Menú 1
</a>
</li>
<li data-gjs-selectable="false">
<a data-gjs-selectable="false" href="javascript:void(0)">
Menú 2
</a>
</li>
<li data-gjs-selectable="false">
<a data-gjs-selectable="false" href="javascript:void(0)">
Menú 3
</a>
</li>
<li data-gjs-selectable="false">
<a data-gjs-selectable="false" href="javascript:void(0)">
Artículo del menú 4
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</div>
`
}),
init(){
var props = this.getAttributes().props;
si (props) {
props = JSON.parse(props);
this.addAttributes({'menuName':p rops['menuName']});
}
},
toHTML: function () {
Sea props:any = {};
props['menuName'] = this.getAttributes().menuName;
return '<menu-nav data-gjs-type="menu-nav" props='${JSON.stringify(props)}'></menu-nav>'
}
})
});
editor. BlockManager.add('menu-nav', {
etiqueta: 'Menú de cabecera',
atributos: {
Clase: 'FA Fa-Bars'
},
Categoría: {
etiqueta: "Menú Dinámico"
},
Contenido: {
Tipo: 'Menu-Nav'
}
});
}
Respuestas (2)
Estás mezclando la API antigua con la nueva para la definición de componentes personalizados. Con 'model: defaultModel.extend({' se requería un 'isComponent' interno estático (estás usando uno externo, como en la nueva API) y sin él, estás rompiendo la Pila de Tipos de Component
Deberías simplemente cambiar 'model: defaultModel.extend({...})' a 'modelar: {...}'Pero en tu caso, también te sugeriría que leas con atención https://grapesjs.com/docs/modules/Components.html
ACTUALIZACIÓN:
Si simplemente extiendo mis componentes personalizados desde textnode en vez de default, entonces el problema se resuelve de alguna manera:
export const NavbarMenu = editor => {
var defaultType = editor. DomComponents.getType("textnode"); <-- cambiado a nodo de texto
var defaultModel = defaultType.model;
editor. DomComponents.addType('menu-nav', {
isComponent: el => el.tagName === 'menu-nav',
model: defaultModel.extend({
......
Pero será mejor si el problema se resuelve por defecto también. ¡Salud
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #1535
[Bug]: Después de eliminar un componente personalizado, la vista del rasgo no se limpia
Hola, Estoy usando la biblioteca grapesjs versión 0.14.33. He creado algunos componentes personalizados y he notado que al eliminar los com...
Issue #3381
Cambiar entre componentes da un error máximo de tamaño de pila de llamadas
Hola artf, me gustaría darte las gracias por crear una herramienta tan potente para crear CMS personalizados. Estoy implementando una funci...
Issue #3328
¿Cómo puedo actualizar el nodeValue (valor de texto) de los componentes mediante formas de entrada
Hola. Grapesjs es una herramienta estupenda. Gracias por ello. Quiero actualizar el valor de texto de un componente por entradas, ¿cómo pue...
Issue #3309
Los Nodos de Texto interfieren al cambiar el contenido en un elemento
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. `...
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.