2013-01-16 13 views
9

Come modificare lo stato dirty di un modulo su false?Come impostare lo stato dirty di Ext.Form?

Esiste qualcosa come il metodo setDirty(false) di Ext.Form.Panel?

UPD:

Il mio compito è quello di replicare Form stato di sporcizia per abilitare il tasto ancorata SAVE per diventare abilitato solo se ci sono dei cambiamenti nella forma.

sto monitoraggio dirtychange evento con:

init: function() { 
    this.control({ 
     'form': { 
      dirtychange: function(form) { 
       alert('change');  
      } 
     } 
    }); 
} 

Ma quando sto caricando un record attraverso loadRecord() metodo nel modulo che sto geting chage avviso mentre il record di carico e forma diventa sporco dopo record è stato caricato .

Desidero ripristinare lo stato dirty di un modulo subito dopo il caricamento del record e avviare l'evento di tracciamento dirtychange in formato record.

Qualche idea?

risposta

14

Correzione

C'è una proprietà a disposizione che cambia l'originale valore quando un valore Get Set.

trackResetOnLoad: vero

Vedere questo JSFiddle

Vecchio risposta qui sotto potrebbe essere smettere scomodo, ma ho lasciarlo invariato

Prima di tutto devo dire che si vuole non trovare alcun metodo tale

E questo perché il modulo non ha un tale stato, i campi ce l'hanno. Tutto ciò che fa il modulo sta iterando su ogni campo e controlla se è sporco. Se un campo è sporco, verrà controllato se questo valore (il segno sporco) è cambiato dall'ultimo controllo e in tal caso viene generato l'evento dirtychange. Allora questo vengono salvati come ultimo controllo (wasDirty)

Ora diamo un'occhiata ai campi causa che realmente innescare:

Essi stanno controllando onChange e onReset se il campo è sporca controllando !me.isEqual(me.getValue(), me.originalValue) dove originalValue è la valore impostato per l'ora in cui è stato chiamato initValue.

Ora quello che sta per fare per 'set' il modulo non è più 'sporco'

iterare su tutti i campi del modulo utilizzando getFields() su Ext.form.Basic ora ci impostare il valore corrente come valore originale (reset ora resetta a questo valore) chiamando initValue su ogni campo e il gioco è fatto.

codice errato rimosso

Modifica

Beh ho modificato il mio ultimo codice dall'alto per

var items = form.getForm().getFields().items, 
     i = 0, 
     len = items.length; 
    for(; i < len; i++) { 
    var c = items[i]; 
    if(c.mixins && c.mixins.field && typeof c.mixins.field['initValue'] == 'function') { 
     c.mixins.field.initValue.apply(c); 
     c.wasDirty = false; 
    } 
} 

e biforcuta un working example. Il pulsante rimarrà inattivo fino a quando non verranno rilevate eventuali modifiche e verrà nuovamente impostato inattivo se si rimuovono le modifiche. Gioca con lui Immagino che questo sia quello che stai cercando.

+0

Sembra che 'Ext.Form.Field' non abbia il metodo' SetDirty() '. –

+0

Vedi domanda aggiornata –

+1

@ s.webbandit Vedere la mia risposta aggiornata – sra

1

C'è il metodo reset(). Se usato senza argomenti mantiene i dati del modulo caricati con loadRecord().

Quindi se si chiama reset() dopo aver caricato i dati, il modulo non dovrebbe essere più sporco.

myForm.loadRecord(record); 
myForm.reset(); 

penso, l'evento dirtychange sarà inoltre chiamata caricando i dati, ma dopo il reset() è possibile controllare il modulo con isDirty().

+1

Questo non è corretto, manterrà solo l'istanza del record che è stata associata al modulo ma non i valori caricati. – sra

+0

Hai letto la documentazione ExtJS per 'Ext.form.Basic.reset()'? Ho avuto il problema, che volevo controllare se una finestra di dialogo ha delle modifiche da parte dell'utente quando l'utente ha fatto clic su "chiudi". Se sì, avverto l'utente che ci sono modifiche non salvate. Sto caricando alcuni dati con 'loadRecord()' nel modulo. Ho sempre avuto il mio aspetto sporco da quando ho scoperto che un 'reset()' crea uno stato non sporco dopo aver caricato i dati. – ChrisLo

+1

Hai letto? Ma è importante in quale momento il record viene caricato, perché se un modulo viene reso e mostrato vuoto questo valore viene memorizzato come 'originalValue' e' reset() 'ripristinerà questo' originalValue' sul campo. L'argomento booleano cancellerà semplicemente il riferimento del record se impostato su true. Quindi, se si carica un record dopo che il campo è stato inizializzato, il reset cancella tutti i valori dai campi a meno che non si carichi il record prima di inizializzare il campo o si imposta la proprietà trackResetOnLoad su true (che sovrascriverà il valore originale) – sra

1

Una soluzione è quella di utilizzare un campo nascosto e impostarne il valore per forzare il modulo sporco. Lo usiamo in widget che non contengono campi modulo. Per impostare il modulo sporco, semplicemente cambiamo il valore del campo nascosto, per impostarlo pulito, lo ripristiniamo al valore originale.

Problemi correlati