Issue #2129✓ ResueltoAbierto el 11 de julio de 2019por nikitha12Reacciones 16

Cómo añadir un botón dentro del modal por defecto y capturar su evento de clic

Respuesta rápidapor giorgiosjames12

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)

👍 Muy útilgiorgiosjames12 de julio de 2019

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(); };

artf14 de julio de 2019

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).

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.