Guardado de componentes personalizados
Hola @sonnylloyd creo que el problema es que no estás reflejando correctamente la propiedad 'icono'. Prueba con esto '''js ... Modelo Intenta dejar dentro del modelo solo cosas "relacionadas con el modelo", updateIcons() { this.set('icon', this.get('iconslist')); }, ... Vista init() { this.listenTo(this.model, 'change...
Lee la respuesta completa abajo ↓Pregunta
Hola @artf siento ser un fastidio, realmente no quería abrir un ticket de problema, pero llevo días atascado intentando alcanzar mi objetivo final
He creado un plugin sencillo que añade soporte para iconos (fuente: awsom), así que tengo un components.js, un block.js y un main.js con algunas configuraciones
He conseguido que el OnChange funcione, pero no sé cómo actualizar el modal porque al refrescar el icono de nuevo seleccionado vuelve al icono por defecto. Seguro que estoy haciendo algo mal y he mirado todos tus gjs y no consigo entenderlo
block.js
bm.add('icon', {
etiqueta: 'Icono',
atributos: {
título: 'Insertar icono',
Clase: 'FA FA-asterisco',
},
Contenido: '<span data-gjs-custom-name="icon" data-gjs-draggable="*" data-gjs-droppable="false" class="icon"></span>',
});
component.js
domc.addType('icon', {
model: defaultModel.extend({
defaults: Object.assign({}, defaultModel.prototype.defaults, {
Iconslist: c.icons,
icono: c.icon,
arrastrable: '.col',
Droppable: falso,
Rasgos: [
{
tipo: 'select',
etiqueta: 'Icono',
Nombre: 'Iconslist',
cambioProp: 1,
Opciones: C.icons
}],
script: function() {}
}),
init() {
var icon = this.get('icon');
console.log('init', icono);
this.listenTo(this, 'change:iconslist', this.updateIcons);
},
updateIcons() {
var icon = this.get('iconslist');
this.set('icon',icon);
vista const = this.view;
si (ver) {
var i = view.el.querySelector('[data-js=icon]');
i.NombreclaseT= "";
i.classList.add('fa');
i.classList.add(icon);
}
},
}, {
isComponent: function(el) {
si (hasClass(el, 'icon')) {
return {
Tipo: 'icono'
};
}
},
}),
view: defaultView.extend({
init() {
const comps = this.model.get('components');
if (!comps.length) {
comps.reset();
comps.add('
<i data-js="icon" class="fa ${c.icon}"></i>
`);
}
}
}),
});
Y en main.js tengo algunos valores predeterminados configurados (los he reducido)
Sea defaults = {
icono: 'fa-snapchat-fantasma',
Iconos: [
{
"valor": "fa-glass",
"nombre": "cristal"
},
{
"valor": "fa-música",
"Nombre": "Música"
}
]
}
Respuestas (3)
Hola @sonnylloyd creo que el problema es que no estás reflejando correctamente la propiedad 'icono'. Prueba con esto '''js ... Modelo Intenta dejar dentro del modelo solo cosas "relacionadas con el modelo", updateIcons() { this.set('icon', this.get('iconslist')); },
... Vista init() { this.listenTo(this.model, 'change:icon', this.updateIcon); } updateIcon() { icono de const = this.model.get('icon'); this.el.innerHTML = '<i data-js="icon" class="fa ${icon}"></i>'; } render() { defaultView.prototype.render.apply(this); this.updateIcon(); devuelvo esto; }
Gracias @artf he estado probando tu sugerencia pero sin suerte. De nuevo, perdón por ser un dolor
Aquí tienes la actualización component.js
domc.addType('icon', {
model: defaultModel.extend({
defaults: Object.assign({}, defaultModel.prototype.defaults, {
icono: c.icon,
iconos: c.icons,
etiquetaNombre: 'icono',
arrastrable: '.col',
Droppable: falso,
Rasgos: [
{
tipo: 'select',
etiqueta: 'iconos',
Nombre: 'Iconos',
Opciones: C.icons
}]
}),
init() {
console.log('init 1');
this.listenTo(this, 'change:icons', this.updateIcons);
},
updateIcons() {
console.log('him here 1');
this.set('icon', this.get('icons'));
}
}, {
isComponent: function(el) {
si (hasClass(el, 'icon')) {
return {
Tipo: 'icono'
};
}
},
}),
view: defaultView.extend({
init() {
console.log('him here 2');
this.listenTo(this.model, 'change:icon', this.updateIcon);
const comps = this.model.get('components');
if (!comps.length) {
comps.reset();
comps.add('
<i data-js="icon" class="fa ${c.icon}"></i>
`);
}
},
updateIcon() {
icono de const = this.model.get('icon');
console.log('updateIcon', icon);
this.el.innerHTML = '<i data-js="icon" class="fa ${icon}"></i>';
},
render() {
defaultView.prototype.render.apply(this);
this.updateIcon();
devuelvo esto;
}
}),
});
@sonnylloyd revisar mejor mi código, has cambiado 'init()' dentro del modelo, lo cual estaba bien en tu código anterior. Como ves, bajo el '... model', solo tienes que cambiar el 'updateIcons()'
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #951
[PREGUNTA] La selección de componentes personalizados no es posible desde el lienzo.
Hola, Intenté averiguarlo por mi cuenta, pero siento que estoy dando vueltas un poco en círculos. Así que espero que tengáis tiempo para le...
Issue #1030
[Pregunta] Eventos de disparo con componentes personalizados
Estoy intentando crear un plugin para Grapesjs con algunos componentes personalizados, y tengo problemas para activar eventos e interactuar...
Issue #1902
[PREGUNTAS] Desactivar/cambiar el comportamiento de los componentes integrados
Hola, Intentando conseguir trabajo de GrapesJ para un proyecto en el que estoy trabajando actualmente. ¿Pero hay alguna forma de desactivar...
Issue #358
Llamando updateScript desde la sección de script de un pluging
Hola a todos, Llevo unas horas atascado intentando averiguar cómo llamar a updateScript desde la sección de scripts de un plugin personaliz...
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.