Plugins de retorno de promesas
Yo tenía un requisito similar. Si sirve de ayuda, mi solución al final fue crear un plugin que luego cargue mis otros plugins; La configuración del editor solo referenciaría ese plugin y las opciones de plugin para ese plugin contendrían los plugins y las opciones para que los demás se carguen. El código del plugin; '...
Lee la respuesta completa abajo ↓Pregunta
Hola @artf, Tengo un caso en el que un plugin personalizado necesita comprobar los permisos de usuario antes de hacer cualquier tipo de inicialización. El método que realiza la comprobación devuelve una Promesa, así que tengo que esperar a que se resuelva antes de hacer nada. Desafortunadamente, esto crea una condición de elevación con el renderizado del editor y la interfaz entra en un estado extraño. Para solucionar este problema tengo que poner 'editor.autorender' en false y luego renderizar editor manualmente una vez que mi plugin esté inicializado. Esto está bien por ahora, pero no estoy muy seguro de cómo manejaría este caso si tuviera varios plugins personalizados dependiendo de alguna lógica asíncrona.
Así que sería muy bueno que GrapesJS pudiera comprobar si alguno de los plugins registrados devuelve Promises y solo renderizar el editor cuando todos estén resueltos.
Gracias por tu increíble proyecto.
Respuestas (3)
Yo tenía un requisito similar. Si sirve de ayuda, mi solución al final fue crear un plugin que luego cargue mis otros plugins;
La configuración del editor solo referenciaría ese plugin y las opciones de plugin para ese plugin contendrían los plugins y las opciones para que los demás se carguen.
El código del plugin; '''js exporta por defecto grapesjs.plugins.add("async-plugins", async (editor, opts) => { /** * opts = { * plugins: [ ... ] * pluginsOpts: { ... }, * render: true | false, // Si no se configura, esto será predeterminado como verdadero. * onFinished: async (editor) => { * // Cuando el plugin asincrónico ha terminado. * }, * }; * * Si usas el 'render' aquí, asegúrate de poner 'autorender' en false en la configuración del editor. */ Carga los plugins especificados. para (sea i = 0, len = opts.plugins.length; i < len; i++) { const pluginId = opts.plugins[i]; if (!opts.pluginsOpts) { opts.pluginsOpts = {}; } Intenta conseguir el plugin si ya está registrado. let plugin = grapesjs.plugins.get(pluginId); if (!plugin) { const wplg = window[pluginId]; plugin = wplg & & wplg.default ? wplg.default : wplg; } Intenta ejecutar el plugin usando 'await'. If (plugin) { await plugin(editor, opts.pluginsOpts[pluginId] || {}); } else if (pluginId instancia de Function) { await pluginId(editor, {}); } else { console.warn('No se ha podido cargar el plugin ${pluginId}.'); } } Renderiza el editor si este plugin ha sido configurado para ello. si (opts.render === indefinido || opts.render === true) { editor.render(); } Si hay una llamada 'onFinished', dale. if (opts.onFinished) { await opts.onFinished (editor); } });
El código de init del editor;
'''js
grapesjs.init({
...
autorender: false,
Plugins: [ 'Async-plugins' ],
pluginsOpts: {
'async-plugins': {
Plugins: [ ... ],
pluginsOpts: { ... },
Render: Cierto,
onFinished: async (editor) => {
console.log("TERMINADO");
},
},
},
...
});
Además, esto puede requerir que el método init de GrapesJS devuelva una Promesa en lugar del editor, pero esto solo puede limitarse a los casos en que existan plugins que devuelvan Promesas.
tengo que poner 'editor.autorender' en falso y luego renderizar editor manualmente una vez que se inicialice mi plugin. Esto está bien por ahora, pero no estoy muy seguro de cómo manejaría este caso si tuviera varios plugins personalizados que dependieran de alguna lógica asíncrona
Solo usa una variable como indicador que cuenta tu lógica de ejecución personalizada y, una vez terminada, estás listo para renderizarla. En mi humilde opinión, la solución con Promises es absolutamente abrumadora para algo así
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #2940
RemoveChildren en Components.js ejecutándose con un componente indefinido
Hola @artf mucho tiempo, espero que todo vaya bien contigo y tus seres cercanos. Hay un pequeño caso que quería preguntar qué opinas antes...
Issue #2793
Extender los rasgos de imagen
Hola, Me gustaría ampliar el tipo de imagen con algunas opciones, especialmente con una opción de redirección al hacer clic. Probé esta sol...
Issue #1753
[Bug/Pregunta] StyleManager - SectorsView - addToCollection() utiliza el atributo "name" para construir el ID y falla con varios espacios o caracteres especiales
Hola @artf, Usando la propiedad pluginOpts del método grapesjs.init(), personalicé los sectores que aparecen en el Style Manager (a través...
Issue #2290
[Solicitud de Reportaje] Nuevo tipo de rasgo: relación entre componentes
Tengo un componente personalizado que renderiza los resultados de una consulta remota dentro de un componente, así que añadí un rasgo de te...
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.