Objetivo:null al añadir vídeo
@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?
- Arrastrar y soltar el vídeo al área de lienzo desde el administrador de bloques
- 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)
@artf ¿puedes ayudarme con esto, por favor?
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.
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?
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í:
- Consulta la documentación de GrapesJS de tu módulo específico
- Busca el método del oyente de eventos 'on()'
- 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.
Issue #3873
Bloque de vídeo duplicado al volver a adjuntar el editor de GrapesJs al documento
Versión GrapesJS [X] Confirmo que se debe usar la última versión de GrapesJS ¿Qué navegador usas? Chrome v94 Enlace de demo reproducible ht...
Issue #4906
Grapesjs no reconoce los tipos de componentes al configurar innerHTML mediante script.
Versión GrapesJS [X] Confirmo que se debe usar la última versión de GrapesJS ¿Qué navegador usas? Chrome v108.0.5359.98 Enlace de demo repr...
Issue #3759
ErrorTipoUncatch: No se ejecutó 'appendChild' en 'Node': el parámetro 1 no es de tipo 'Node'.
Versión GrapesJS[X] Confirmo que se debe usar la última versión de GrapesJS¿Qué navegador usas? Versión nueva de ChromeEnlace de demo repro...
Issue #5820
Doble entrada en capas si el componente se mueve directamente después de añadir
Versión GrapesJS[X] Confirmo que se debe usar la última versión de GrapesJS¿Qué navegador usas? Chrome v123Enlace de demo reproducible http...
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.
Tutorial
How to Build a Production GrapesJS Editor: The Complete Walkthrough of Brief, Preset, Plugins, and Services
A complete walkthrough of building a production GrapesJS editor: how to choose a preset, pick plugins, and scope setup services without burning a sprint.
Tutorial
Big Updates: TinyMCE 8 and Placeholder 2.0 for GrapesJS
In May we shipped major updates to two of our most popular GrapesJS plugins — TinyMCE Inline Text Editor and Placeholder.
Tutorial
Find the Right GrapesJS Plugin in Seconds: Smarter Discovery Is Live
We're shipping a set of discovery upgrades. New label filters, a proper compatibility switch for GrapesJS vs Studio, one-click and a smarter sort bar.
Explorar categorías de plugins
Ve directamente a las páginas de categorías de plugins en el marketplace.