Cuando la vista del componente modifica el HTML, los componentes de texto ya no son editables
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)
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. :(
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>')')
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.
Issue #513
Edición de modelo y HTML devuelta
Tengo el código de abajo para crear un componente personalizado y quiero recuperar html actualizado vía editor.html(), pero si devolvo HTML...
Issue #701
Modificar un componente en el editor elimina el contenido del modelo
Lo que intento conseguir: Tengo atributos especiales de "datos-" en algunos de los componentes que extrao al editor. Cuando uno de estos se...
Issue #1964
[PREGUNTA] Requisitos mínimos para crear un componente personalizado
He estado leyendo la documentación todo el día sobre cómo crear un componente personalizado. También he mirado grapesjs-mjml como ejemplo....
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...
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 →Tutoriales relacionados
Guías detalladas sobre el mismo tema.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.