Issue #459💬 RespondidoAbierto el 28 de octubre de 2017por roytangReacciones 1

Error al incluir un componente personalizado dentro de otro bloque

Respuesta rápidapor roytang1

Viendo que tu comentario corrigió el error original que encontré, cerraré este comentario y publicaré uno aparte para mis preguntas sobre el uso de la propiedad droppable.

Lee la respuesta completa abajo ↓

Pregunta

Perdón por el título tan vago. No sé cómo describirlo de forma concisa. Tengo un bloque personalizado donde quiero restringir que solo se puedan colocar imágenes en una parte concreta del bloque. Probé algo así:

  comps.addType('image-container', {
    model: defaultModel.extend({
      Extender propiedades predeterminadas
      defaults: Object.assign({}, defaultModel.prototype.defaults, {
        Solo puede dejar caer estos elementos dentro de él
        Droppable: "IMG",
      }),
    },
    {
      isComponent: function(el) {
        if(el.tagName == 'DIV' && $(el).hasClass("image-container")){
          return {type: "image-container"};
        }
      },
    })
  });

blockManager.add('test-with-image-container', {
    etiqueta: 'Bloque de prueba con contenedor de imagen',
    Atributos: {Clase:'FA FA-lápiz'},
    contenido: '<div class="test-block">Puedes dejar una imagen abajo:<div class="image-container"></div></div>',
    categoría: 'Bloques',
  });

Sin embargo, cuando hago esto, intentar arrastrar el bloque fuera de la paleta de bloques genera el siguiente error:

... grapes.min.js:2 Tipo no capturadoError: s no es un constructor en F.i.addToCollection (VM6196 grapes.min.js:2) en VM6196 grapes.min.js:2 en Function.C.each.C.forEach (VM6196 grapes.min.js:2) at F.i.each (VM6196 grapes.min.js:2) at F.i.render (VM6196 grapes.min.js:2) en F.i.renderChildren (VM6196 grapes.min.js:2) at F.i.render (VM6196 grapes.min.js:2) en F.i.addToCollection (VM6196 grapes.min.js:2) at F.i.addTo (VM6196 grapes.min.js:2) at y (VM6196 grapes.min.js:2) ...

¿Algún consejo? ¿Hay una forma mejor de lograr lo que quiero hacer?

¡Gracias!

Respuestas (3)

roytang5 de noviembre de 2017

Viendo que tu comentario corrigió el error original que encontré, cerraré este comentario y publicaré uno aparte para mis preguntas sobre el uso de la propiedad droppable.

artf30 de octubre de 2017

La 'vista' es obligatoria cuando defines un nuevo tipo de Componente '''js comps.addType('image-container', { modelo: defaultModel... view: defaultView; });

roytang4 de noviembre de 2017

¡Gracias! Añadir la Vista por defecto sí eliminó el error, pero sigo sin poder hacer lo que quiero: no consigo dejar una imagen dentro de la parte de "contenedor de imágenes" del ejemplo anterior. Cuando intento dejar el componente de imagen ahí, se inserta en el "bloque de prueba" que lo contiene en su lugar.

Mi código de prueba ahora es:

  comps.addType('image-container', 
  {
    model: defaultModel.extend(
    {
      Extender propiedades predeterminadas
      por defecto: Object.assign({}, defaultModel.prototype.defaults, 
      {
        Solo puede dejar caer estos elementos dentro de él
        Droppable: "IMG",
      }),
    },
    {
      isComponent: function(el) 
      {
        if(el.tagName == 'DIV' && $(el).hasClass("image-container"))
        {
          return {type: "image-container"};
        }
      },
    }),
    view: defaultView
  });

blockManager.add('test-with-image-container', 
  {
    etiqueta: 'Bloque de prueba con contenedor de imagen',
    Atributos: {Clase:'FA FA-lápiz'},
    contenido: '<div class="test-block">Puedes dejar una imagen abajo:<div class="image-container"></div></div>',
    categoría: 'Bloques',
  });  

¿Estoy usando mal la propiedad de "droppable"? Solo tiene que ser un selector CSS, ¿verdad?

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.