Issue #460💬 RespondidoAbierto el 28 de octubre de 2017por roytangReacciones 2

Cuando la vista del componente modifica el HTML, los componentes de texto ya no son editables

Respuesta rápidapor roytang1

Probé lo anterior, como sigue: Pero sigo sin poder editar el texto en los elementos h1 y p después de dejar el componente en el lienzo. :(

Lee la respuesta completa abajo ↓

Pregunta

Estoy intentando crear un componente personalizado que contenga algo de texto lorem ipsum en el contenido, para editarlo una vez que esté en el lienzo. Pero también quiero modificar el HTML en la vista (para añadir contenido que quiero mostrar en el editor pero no en el HTML guardado). Probé algo así:

  comps.addType('section-test', {
    Defina el modelo
    model: defaultModel.extend({
      Extender propiedades predeterminadas
      defaults: Object.assign({}, defaultModel.prototype.defaults, {
        arrastrable: 'cuerpo, cuerpo div'
      }),
    },
    {
      isComponent: function(el) {
        if(el.tagName == "SECTION"){
          return {type: 'section-test'};
        }
      },
    }),

Definir la vista
    view: defaultType.view.extend({
      El render() debería devolver 'esto'
      render: función () {
        Extiende el método de renderizado original
        defaultType.view.prototype.render.apply(esto, argumentos);
        this.el.placeholder = 'Texto aquí'; <- No afecta al código HTML final
        var html = this.el.innerHTML;
        html = "<h1>ABC</h1>" + html;
        this.el.innerHTML = html;

devuelvo esto;
      },
    })
  });
  blockManager.add('section-typography', {
    etiqueta: 'Sección de texto',
    categoría: 'Secciones',
    Contenido: '<section class="bdg-sect">
      <h1 class="encabezado">Insertar título aquí</h1>
      <p class="paragraph">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua</p>
      ',</section>
    Atributos: {Clase:'GJS-Fonts GJS-F-H1P'}
  });    

El problema es que si modifico la función render() como antes, los componentes de texto en la sección de Texto (el h1 y el p) ya no pueden editar su texto haciendo doble clic en el texto.

¿Hay una forma mejor de hacer lo que quiero hacer?

¡Gracias!

Respuestas (3)

roytang4 de noviembre de 2017

Probé lo anterior, como sigue:

  var textType = comps.getType('text');
  comps.addType('section-test', {
    Defina el modelo
    model: defaultModel.extend({
      Extender propiedades predeterminadas
      defaults: Object.assign({}, defaultModel.prototype.defaults, {
        arrastrable: 'cuerpo, cuerpo div'
      }),
    },
    {
      isComponent: function(el) {
        if(el.tagName == "SECTION"){
          return {type: 'section-test'};
        }
      },
    }),

Definir la vista
    view: textType.view.extend({
      El render() debería devolver 'esto'
      render: función () {
        Extiende el método de renderizado original
        defaultType.view.prototype.render.apply(esto, argumentos);
        this.el.placeholder = 'Texto aquí'; <- No afecta al código HTML final
        var html = this.el.innerHTML;
        html = "<h1>ABC</h1>" + html;
        this.el.innerHTML = html;

devuelvo esto;
      },
    })
  });
  blockManager.add('section-typography', {
    etiqueta: 'Sección de texto',
    categoría: 'Secciones',
    Contenido: '<section class="bdg-sect">
      <h1 class="encabezado">Haz clic aquí para editar el título</h1>
      <p class="paragraph">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua</p>
      ',</section>
    Atributos: {Clase:'GJS-Fonts GJS-F-H1P'}
  });    

Pero sigo sin poder editar el texto en los elementos h1 y p después de dejar el componente en el lienzo. :(

artf7 de noviembre de 2017

Perdona, no me había dado cuenta '''js var html = this.el.innerHTML; html = "<h1>ABC</h1>" + html; this.el.innerHTML = html;

básicamente eliminas elementos con modelos y adjuntas una nueva cadena como HTML (el editor ya no puede acceder a sus modelos). Si quieres añadir un nuevo componente, deberías hacerlo a través de modelos (por ejemplo, 'view.model.append('<div>stuff</div>')')
artf30 de octubre de 2017

Puedes ampliar el componente de texto en lugar del base '''js const defaultType = comps.getType('default'); const textType = comps.getType('text'); ... view: textType.view.extend({ ...

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.