Arrastra el componente sobre el lienzo con script, script añadido varias veces.
Así que investigué y pensé que era el método 'updateScript' en la 'canvasView' el que se llamaba cada vez que se encontraba una propiedad 'script' en un componente, independientemente de si se arrastraba o no sobre el lienzo. Hice algunos parches para probar y parece que solucionó el problema. Tuve que sobrescribirlo...
Lee la respuesta completa abajo ↓Pregunta
Hola, no estoy seguro de si esto es un error o no.
Pero he notado un comportamiento extraño: cuando arrastro un bloque que tiene un componente que contiene una función de script, parece que lo añade al lienzo antes de que se suelte.
Y al dejarlo caer, añade otra vez, el guion.
Si nunca sueltas el bloque y simplemente arrastras hacia arriba y hacia afuera y hacia atrás, se añade tantas veces como puedas.
Y nunca parece que aprenda cuando hago clic en borrar lienzo, tuve que hacerlo manualmente:
'Editor. Canvas.getCanvasView().getJsContainer().innerHTML = '';'
Para limpiar el lienzo JS.
Aquí tienes una captura de pantalla del número en tu página de demostración.
! imagen
Respuestas (3)
Así que investigué y pensé que era el método 'updateScript' en la 'canvasView' el que se llamaba cada vez que se encontraba una propiedad 'script' en un componente, independientemente de si se arrastraba o no sobre el lienzo.
Hice algunos parches para probar y parece que solucionó el problema.
Tuve que sobrescribirlo así porque no quería modificar el código original directamente, por si en el futuro se arreglaba.
No sabía cómo detectar si el modelo estaba siendo arrastrado en ese momento, solo noté que cuando el componente se suelta en el lienzo, se llama 'updateScript', 'modelOpt' tenía un atributo extra 'at', así que confié en esto.
Hasta que alguien haga una solución mejor y más limpia.
const canvasView = editor. Canvas.getCanvasView();
canvasView.updateScript = función(vista) {
Comprueba si existe el atributo, si no, asume que seguimos arrastrando
if (!isUndefined(view.modelOpt.at)) {
modelo const = view.model;
id de const = model.getId();
Comprueba si hemos insertado previamente el script, y si es así, elimínalo
let previousScript = this.getJsContainer().querySelector('script[data-model-id="${id}"]');
if (previousScript !== null) previousScript.parentElement.remove();
if (!view.scriptContainer) {
view.scriptContainer = document.createElement('div');
this.getJsContainer().appendChild(view.scriptContainer);
}
view.el.id = id;
view.scriptContainer.innerHTML = '';
En el editor, utilizo setTimeout como durante el proceso de añadir elementos
Esos no estarán disponibles de inmediato, por lo tanto la variable 'ítem'
const script = document.createElement('script');
Establece un atributo personalizado para la etiqueta de script, para detectarlo y eliminarlo al arrastrar el mismo bloque dentro del lienzo
script.setAttribute('data-model-id', id);
script.innerHTML = '
setTimeout(function() {
var item = document.getElementById('${id}');
si (!ítem) regresa;
(función(){
${model.getScriptString()};
}.vincular(ítem))()
}, 1);';
// #873
Añadir setTimeout hará que los componentes js funcionen en init del editor
setTimeout(() => view.scriptContainer.appendChild(script), 0);
}
}
Mi solución anterior no funcionó, así que tuve que desecharlo y volví a abrir el problema.
Hola @simplecommerce si crees que es un error, por favor abre un problema SIGUIENDO la plantilla y crea una demo en vivo reproducible del problema. Es muy importante porque, al no tener mucho tiempo libre, corremos el riesgo de perder gran parte de él en problemas de depuración que no estén relacionados con la propia biblioteca
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #1174
¿Cómo cambiar el contenido de un componente arrastrado?
Hola a todos, Estoy un poco atascado creando un componente personalizado. Un bloque personalizado que estoy construyendo actualmente deberí...
Issue #1815
[Bug]: component:mount se dispara varias veces
Había estado usando eventos del editor y noté que el evento 'component:mount' se activa varias veces cuando un componente se arrastra de bl...
Issue #1727
[PREGUNTA] Evento para que los niños vean
Tengo un problema con un componente. Cuando dejo caer un componente en el lienzo, creo un objeto sencillo. Antes de añadir este objeto nece...
Issue #1186
[Bug] El rasgo numérico devuelve 'indefinido'
Hola, o es un error o una pregunta, aún no lo sé. He definido un nuevo componente con —junto a otros— un rasgo numérico, como puedes ver en...
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 →Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.