Issue #1895💬 RespondidoAbierto el 15 de marzo de 2019por simplecommerceReacciones 0

Arrastra el componente sobre el lienzo con script, script añadido varias veces.

Respuesta rápidapor simplecommerce

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)

simplecommerce17 de marzo de 2019

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);
      }
    }
simplecommerce31 de marzo de 2019

Mi solución anterior no funcionó, así que tuve que desecharlo y volví a abrir el problema.

artf3 de abril de 2019

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.

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 →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.