2011-12-19 10 views

Respuesta

18

actualización: (! Gracias @innerJL) ha añadido una tercera opción basada en la punta de los comentarios

Ok, parece que hay al menos dos maneras bastante simples para hacerlo.

Opción 1) Añadir un oyente 'cambio' a cada campo que se agrega a la forma:

Ext.define('myapp.MyFormPanel', { 
    extend: 'Ext.form.Panel', 
    alias: 'myapp.MyFormPanel', 
    ... 

    handleFieldChanged: function() { 
    // Do something 
    }, 

    listeners: { 
    add: function(me, component, index) { 
     if(component.isFormField) { 
     component.on('change', me.handleFieldChanged, me); 
     } 
    } 
    } 
}); 

Esto tiene al menos un gran inconveniente; si "ajusta" algunos campos en otros contenedores y luego agrega esos contenedores al formulario, no reconocerá los campos anidados. En otras palabras, no realiza una búsqueda "profunda" a través del componente para ver si contiene un campo de formulario que necesita "cambiar" oyentes.

Opción 2) Utilice una consulta de componentes para escuchar todos los eventos de 'cambio' disparados desde los campos de un contenedor.

Ext.define('myapp.MyController', { 
    extend: 'Ext.app.Controller', 
    ... 

    init: function(application) { 
    me.control({ 

     '[xtype="myapp.MyFormPanel"] field': { 
      change: function() { 
       // Do something 
      } 
     } 
    }); 
    } 
}); 

Opción 3) Escuchar para el 'dirtychange' despedido de forma subyacente 'básico' (Ext.form.Basic) del panel de formato. Importante: debe asegurarse de habilitar 'trackResetOnLoad' asegurando que {trackResetOnLoad: true} se pase al constructor de su panel de formulario.

Ext.define('myapp.MyFormPanel', { 
    extend: 'Ext.form.Panel', 
    alias: 'myapp.MyFormPanel', 
    constructor: function(config) { 
    config = config || {}; 
    config.trackResetOnLoad = true; 
    me.callParent([config]); 

    me.getForm().on('dirtychange', function(form, isDirty) { 
     if(isDirty) { 
      // Unsaved changes exist 
     } 
     else { 
      // NO unsaved changes exist 
     } 
    }); 
    } 
}); 

Este enfoque es el "más inteligente"; le permite saber cuándo se ha modificado el formulario, pero también si el usuario lo modifica a su estado original. Por ejemplo, si cambian un campo de texto de "Foo" a "Bar", el evento "dirtychange" se activará con "true" para isdirty param. Pero si el usuario luego cambia el campo a a "Foo", el evento 'dirtychange' disparará nuevamente y isDirty será .

+1

tal vez este caso de BasicForm (yourForm.getForm()) podría ser útil para Usted http://docs.sencha.com/ext-js/4-0/ #!/api/Ext.form.Basic-event-dirtychange –

+0

Si alguien tiene una solución para ExtJs 3 me interesaría. – gunnx

+1

Tenga cuidado con la tercera opción. El oyente se activará solo cuando la propiedad 'isDirty' del formulario cambie. Eso significa que si tiene el campo de texto con el valor "Foo" y el usuario cambia ese valor a "Barra" - se activará "cambio sucio". Pero si el usuario cambia el valor nuevamente a "Pool", 'dirtychange' NO se activará porque la propiedad' isDirty' ya es 'verdad' –

6

Quiero complementar la respuesta de Clint. Hay un enfoque más (y creo que es lo mejor para su problema). Sólo tiene que añadir change oyente para formar valores por defecto de configuración:

Ext.create('Ext.form.Panel', { 
    // ... 
    defaults: { 
     listeners: { 
      change: function(field, newVal, oldVal) { 
       //alert(newVal); 
      } 
     } 
    }, 
    // ... 
}); 
+0

¡Gracias por la entrada! En mi caso, realmente necesito una clase personalizada que amplíe el panel de formulario; también solo quiero saber cuándo se cambia un campo de su valor original ('dirtychange' vs.'cambio') pero esto podría ser un gran consejo para otros escenarios donde esos dos requisitos no se aplican. –

+0

No hay tal evento de cambio en el panel de formulario ni lo escucha. – Marshal

+2

@Marshal. No escribí esa forma tiene tal evento. Los campos de formulario tienen tales eventos. En mi controlador de ejemplo NO fue asignado a la forma. Fue asignado a todos los campos de la forma. Vea la configuración [defaults] (http://docs.sencha.com/extjs/4.2.0/#!/api/Ext.form.Panel-cfg-defaults). –

Cuestiones relacionadas