Issue #3806💬 RespondidoAbierto el 22 de septiembre de 2021por throne1986Reacciones 0

Objetivo:null al añadir vídeo

Respuesta rápidapor throne1986

@artf ¿puedes ayudarme con esto, por favor?

Lee la respuesta completa abajo ↓

Pregunta

Versión GrapesJS

  • Confirmo que se debe usar la última versión de GrapesJS

¿Qué navegador usas?

Versión nueva de Chrome

Enlace de demo reproducible

https://codesandbox.io/s/react-redux-toolkit-application-forked-l5rhp?file=/src/pages/Editor.js

Describe el bicho

¿Cómo reproducir el bicho?

  1. Arrastrar y soltar el vídeo al área de lienzo desde el administrador de bloques
  2. Intenta añadir vídeo en el modal pasando el cursor por el vídeo y pulsando el botón usar vídeo

¿Cuál es el comportamiento esperado? Cuando el usuario navega un vídeo y hace clic en usar el botón de vídeo, debería añadir un vídeo a la etiqueta de vídeo en un lienzo

¿Cuál es el comportamiento actual? Cuando el usuario flota sobre un vídeo en modal y pulsa el botón de usar vídeo, el vídeo no se añade en absoluto y en consola muestra objetivo: null

Si es necesario ejecutar algo de código para reproducir el error, pégalo aquí abajo: Aquí está el código del editor de Grapes JS, el código completo se puede encontrar aquí https://codesandbox.io/s/react-redux-toolkit-application-forked-l5rhp?file=/src/pages/Editor.js:715-4094 '''js

useEffect(() => { const editor = grapesjs.init({ contenedor: "#editor", storageManager: false, blockManager: cierto, Plugins: [bloquear] });

editor.on("component:create", (model) => { if (model.get("type") === "video") { setAddVideo(false); console.log("url de vídeo.", videos.videoUrl); editor. Commands.run("open-assets", { objetivo: editor.getSelected(), URL: videos.videoUrl }); } });

editor. DomComponents.addType("video", { modelo: { Predeterminados: { etiquetaNombre: "vídeo", reproducción automática: Cierto, LOOP: Cierto, Silenciado: Cierto, Controles: falso, Cartel: "poster.png", src: "", Arrastrable: Cierto, removible: cierto, Copiable: Cierto, redimensionable: cierto, estilable: [], Rasgos: [] }, init() { console.debug("vídeo - modelo - init"); }, updated(property, value) { si (propiedad === "src") this.set("src", valor); } }, Vista: { eventos: { dblclick: "onActive" }, init() { console.debug("vídeo - ver - init"); const { modelo } = esto;

props const = [ "bucle", "reproducción automática", "controles", "color", "Rel", "modestbranding", "póster" ]; eventos const = props.map((p) => 'change:${p}').join(" ");

this.listenTo(model, "change:src", this.updateSrc); this.listenTo(modelo, eventos, this.updateVideo); }, onRender() { console.debug("vídeo - ver - onRender");

this.updateVideo(); }, updateVideo() { const { model, el } = this;

el.loop = model.get("loop"); el.autoplay = model.get("autoplay"); el.controls = model.get("controls"); el.poster = model.get("poster"); }, updateSrc() { console.debug("vídeo - ver - updateSrc");

const { model, el } = this; si (!el) regresa;

Sea src = model.get("src"); el.src = src; }, onActive(e) { console.debug("vídeo - ver - onActive");

editor.runCommand("open-assets", { Objetivo: esto.modelo, tipos: ["vídeos"], aceptar: "vídeo/*", onSelect() { console.debug("vídeo - subido - onSelect"); editor. Modal.close(); editor. AssetManager.setTarget(null); } });

e.stopPropagation(); } } });

setEditor (editor); }, [despacho]);

si (editor) { editor. Commands.add("open-assets", { run(editor, sender, opts = {}) { dispatch(setIsOpen(true)); console.log("opts", opts); console.log("opts URL", opts.url); if (addVideo) { opts.target.set("src", opts.url); if (opts.url) { dispatch(setIsOpen(false)); } } } }); } const handleUseVideo = (video) => { console.log("vídeo..", vídeo); setAddVideo(true); dispatch(setVideoUrl(video)); editor. Commands.run("open-assets", { objetivo: editor.getSelected(), URL: vídeo }); };


@artf me he quedado sin ideas y necesito ayuda 

### Código de conducta

- [X] Acepto seguir el Código de Conducta de este proyecto

Respuestas (4)

throne198613 de octubre de 2021

@artf ¿puedes ayudarme con esto, por favor?

artf16 de octubre de 2021

El problema está aquí '''js editor.on("component:create", (model) => { if (model.get("type") === "video") { setAddVideo(false); console.log("url de vídeo.", videos.videoUrl); editor. Commands.run("open-assets", { objetivo: editor.getSelected(), // <- cuando dejas caer el vídeo, no se selecciona Objetivo: modelo, URL: videos.videoUrl }); } });

También puedes eliminar ese oyente global y actualizar el bloque de vídeo con 'activar: cierto', mucho más limpio.
throne19863 de noviembre de 2021

El problema está aquí '''js editor.on("component:create", (model) => { si (model.get("type") === "video") { setAddVideo(false); console.log("vídeo url.", videos.videoUrl); editor. Commands.run("open-assets", { // objetivo: editor.getSelected(), // <- cuando dejas caer el vídeo, no se selecciona > > objetivo: model, URL: videos.videoUrl }); } });



    
      
    

      
    

    
  
También puedes eliminar ese oyente global y actualizar el bloque de vídeo con 'activar: verdadero', mucho más limpio.

Hola @artf cambiando como sugeriste, pero aún así, cuando arrastro el bloque de vídeo y selecciono un vídeo, veo en una consola que el objetivo es nulo, lo que significa que no puedo configurar la URL de vídeo seleccionada como esta 'opts.target.set("src", opts.url);'

Aquí tienes codesanbox actualizado https://codesandbox.io/s/react-redux-toolkit-application-forked-l5rhp?file=/src/pages/Editor.js:4197-4230 puedes probar tú mismo arrastrando el vídeo al lienzo; después de que el modal se abra con la lista de películas, solo tienes que seleccionar un vídeo haciendo clic en el botón 'usar vídeo' al pasar el cursor a cualquier vídeo listado en modaL

! imagen

@artf puedes ayudarme con esto?

ClaudeCode17 de mayo de 2026

Gracias por informar de esto, @throne1986.

Buena pregunta sobre Target :null al añadir vídeo. El enfoque recomendado con Canvas es usar la API orientada a eventos.

Empieza aquí:

  1. Consulta la documentación de GrapesJS de tu módulo específico
  2. Busca el método del oyente de eventos 'on()'
  3. La mayoría de las operaciones se pueden realizar escuchando eventos del editor y de los componentes

Patrones comunes: '''javascript Prestad atención a los cambios editor.on('Change', () => console.log('Something Changed'));

Ciclo de vida de los componentes editor.on('component:mount', (c) => console.log('component ready', c)); editor.on('component:update', (c) => console.log('component updated', c));


**Si sigues atascado:**
- Compartir una reproducción mínima de CodeSandbox
- Incluye lo que ya has probado
- Menciona tu versión GrapesJS
- ¡La comunidad está aquí para ayudar!

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.