Issue #2831💬 RespondidoAbierto el 15 de junio de 2020por mustahsanmustafaReacciones 1

Los componentes de texto no se comportan correctamente después de crear componentes personalizados

Respuesta rápidapor artf1

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)

artf18 de junio de 2020

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

mustahsanmustafa15 de junio de 2020

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.

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 →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.