Cómo añadir un botón dentro del modal por defecto y capturar su evento de clic
Eliminar el formulario y simplemente usar javascript para crear/interactuar con el contenido modal funciona bien. 'modal.setContent()' para añadir el botón y 'myButton.onclick = () => {}' para capturar su evento de clic. Aquí tienes un ejemplo de código: '''es6 función openModal() { const pfx = editor.getConfig().styl...
Lee la respuesta completa abajo ↓Pregunta
Quiero un formulario dentro de un modal (usando el modal por defecto), al hacer clic en el botón de enviar hacer una llamada ajax. He creado un nuevo componente que activa un modal al arrastrar y soltar.
Puedo insertar el formulario en el modal
Se ve así:
<img width="1001" alt="Captura de pantalla 2019-07-11 a las 10:22 17 AM" src="https://user-images.githubusercontent.com/36627122/61023023-cf1a4180-a3c5-11e9-8fcb-3da790ff9d61.png">pero no sé cómo rastrear el clic del botón de enviar. Probé a escribir OnSubmit() en un script y lo añadí al contenido modal, pero no funciona.
'const domc = editor. DomComponents;
const defaultType = domc.getType('default');
domc.addType("test-type", {
model: defaultModel.extend(
{
defaults: Object.assign({}, defaultModel.prototype.defaults, {
Tipo: "Tipo de prueba",
id:"popup",
droppable: falso,
redimensionable: Cierto,
etiquetaNombre: "popup",
}),
getAttrToHTML: function() {
var attr = defaultType.model.prototype.getAttrToHTML.apply(this, arguments);
eliminar attr.onmousedown;
var testmarker = this.get("testmarker");
if (testmarker)
attr.testmarker = testmarker;
regresar la atracción;
}
}),
view: defaultType.view.extend({
etiquetaNombre: "botón",
eventos: {
"dblclick": "openModal",
},
inicialize: function(o) {
defaultType.view.prototype.initialize.apply(esto, argumentos);
this.listenTo(this.model, "change:testmarker", this.updateMarker);
this.listenTo(this.model, "dblclick active", this.openModal);
},
updateMarker: function() {
var testmarker = this.model.get("testmarker");
this.$el.attr("testmarker", testmarker);
},
openModal: function(e) {
const modal = editor. modal;
modal.open({
título: '<br>Crear identidad<br>',
Contenido: '
<div class="container">
<br>
<form onsubmit="formSubmit()">
<div class="form-group">
<label>URL</label>
<input type="text" class="form-control" id="url" placeholder="http://test-data/" name="url">
</div>
<br>
<div class="form-group">
<label>Identidad </label>
<input type="text" class="form-control" id="address" placeholder="Introduce Identity Address" name="address">
</div>
<br>
<tipo de botón="enviar" clase="btn btn-danger">Enviar</button>
</form>
<br>
',</div>
});
},
})
});`
¿Es correcto mi enfoque? ¿Debería hacerlo de otra manera?
Respuestas (3)
Eliminar el formulario y simplemente usar javascript para crear/interactuar con el contenido modal funciona bien. 'modal.setContent()' para añadir el botón y 'myButton.onclick = () => {}' para capturar su evento de clic. Aquí tienes un ejemplo de código: '''es6 función openModal() { const pfx = editor.getConfig().stylePrefijo; const modal = editor. modal;
contenedor const = document.createElement('div');
const inputHtml = '<div class="form-group"> <label>URL</label> <input type="text" class="form-control" placeholder="http://test-data/" name="url" id="urlInput">
</div> <br> <div class="form-group"> <label>Identidad </label> <input type="text" class="form-control" placeholder="Enter Identity Address" name="address" id="idInput"> ';</div>const btnEdit = document.createElement('button'); btnEdit.innerHTML = 'Enviar'; btnEdit.className = pfx + 'btn-prim' + pfx + 'btn-import'; btnEdit.onclick = función() { const urlInputElement = document.getElementById('urlInput'); const idInputElement = document.getElementById('idInput');
const urlVal = urlInputElement.value; const idVal = idInputElement.value;
Aquí es donde pones tu lógica AJAX myAjaxCallFunction(urlVal, idVal);
modal.close(); };
modal.setTitle('Crear identidad'); container.innerHTML = inputHtml; container.appendChild(btnEdit); modal.setContent(contenedor); modal.open(); };
La cuestión aquí es que 'content' acepta nodos HTML (no solo cadenas de HTML), así que puedes tener cualquier HTMLElement con cualquier evento adjunto (formularios con envíos, botones con clics, etc.), por lo que el enfoque propuesto es totalmente válido (gracias @giorgiosjames).
@giorgiosjames Gracias, tío, esto (https://github.com/artf/grapesjs/issues/2129#issuecomment-510734779) es un trabajo de maravilla en mi caso.
Tu respuesta me ahorra mucho tiempo :)
Preguntas y respuestas relacionadas
Continúa investigando con debates sobre temas similares.
Issue #1951
[PREGUNTAS] cambiar o añadir evento en añadir componente desde bloque
¿es posible? Cambia el evento de arrastrar y soltar a al hacer clic al añadir un nuevo componente, quiero añadir componentes haciendo clic...
Issue #371
Activa el RTE por defecto con una función personalizada
Hacer correctamente mi llamada a la API, quiero añadir un RTE con función personalizada para añadir un enlace/abrir ventanas nuevas/abrir m...
Issue #3239
[Pregunta] ¿Cómo actualizar atributos o propiedades dinámicamente desde Component Script?
Tenemos un caso de uso en el que queremos insertar gráficos dinámicamente usando Highcharts Editor. He creado un componente que, al arrastr...
Issue #1650
[Pregunta] Cómo eliminar un enlace del texto (eliminar un enlace)
usando RTE integrado e intentando añadir un botón personalizado de RTE que, al hacer clic, elimine el enlace actual. ¿Podrías darme el códi...
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.