2013-01-16 7 views
9

Jak zmienić stan dirty formularza na false?Jak ustawić brudny stan Ext.Form?

Czy jest coś takiego jak setDirty(false) metoda Ext.Form.Panel?

UPD:

Moim zadaniem jest śledzenie Form brudne stan umożliwiającym zadokowany przycisk Zapisz, aby zostać włączone tylko wtedy, gdy istnieją jakiekolwiek zmiany w formularzu.

Śledzę dirtychange wydarzenie:

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

ale kiedy jestem ładowanie rekordu przez loadRecord() metody w formularzu mam czuło chage alert podczas załadunku i rekord Formularz zabrudzi po Rekord został załadowany .

Chciałbym zresetować stan dirty stanu formularza zaraz po Nagraj ładowanie i rozpocząć śledzenie dirtychange zdarzenia w rekordowym formularzu wypełnionym.

Wszelkie pomysły?

Odpowiedz

14

Korekta

Istnieje właściwość dostępna która zmienia oryginalną wartość, gdy wartość gotowi.

trackResetOnLoad: true

Zobacz ten JSFiddle

Starego odpowiedź poniżej można rzucić niewygodne, ale niech on niezmieniony

pierwsze muszę powiedzieć, że będziesz nie znajdzie takiej metody.

A to dlatego, że forma nie ma takiego stanu, pola go mają. Wszystko, co robi formularz, polega na iteracji po każdym polu i sprawdzeniu, czy jest brudny. Jeśli jakiekolwiek pole jest brudne, zostanie sprawdzone, czy ta wartość (brudny znak) zmieniła się od czasu ostatniego sprawdzenia, a jeśli tak, to zdarzenie dirtychange jest uruchamiane. Wtedy to zostaną zapisane jako ostatni check (wasDirty)

Teraz spójrzmy na polach bo oni naprawdę wyzwolić go:

Sprawdzają onChange i onReset jeśli pole jest brudny sprawdzając !me.isEqual(me.getValue(), me.originalValue) gdzie originalValue jest wartość, która została ustawiona na godzinę initValue została wywołana.

Teraz co zrobić, aby „ustawić” Formularz nie jest już „brudny”

iteracyjne nad wszystkie pola formularza za pomocą getFields() na Ext.form.Basic teraz będziemy ustawić aktualną wartość jako pierwotnej wartości (Reset teraz zresetuj do tej wartości), wywołując initValue na każdym polu i to wszystko.

niewłaściwy kod usuwa

Edit

Dobrze I zostały zmodyfikowane mój ostatni kod z wyżej

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

i rozwidlony na working example. Przycisk pozostanie nieaktywny do czasu wykrycia jakichkolwiek zmian i ponownie się wyłączy, jeśli usuniesz zmiany. Baw się z tym, myślę, że właśnie tego szukasz.

+0

Wygląda na to, że 'Ext.Form.Field' nie ma również metody' setDirty() '. –

+0

Zobacz zaktualizowane pytanie –

+1

@ s.webbandit Zobacz moją zaktualizowaną odpowiedź – sra

1

Istnieje metoda reset(). Jeśli zostanie użyte bez argumentu, zachowuje dane formularza załadowane przy użyciu loadRecord().

Jeśli więc po załadowaniu danych wywołasz reset(), Twój formularz nie powinien już być brudny.

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

myślę, zdarzenie dirtychange będzie również nazywany przez ładowania danych, ale po reset() można sprawdzić formę z isDirty().

+1

To nie jest poprawne, zachowa tylko instancję rekordu, która była związana z formularzem, ale nie z załadowanymi wartościami. – sra

+0

Czy przeczytałeś dokumentację ExtJS dla 'Ext.form.Basic.reset()'? Miałem problem, że chciałem sprawdzić, czy okno dialogowe zostało zmienione przez użytkownika, gdy użytkownik kliknął "zamknij". Jeśli tak, ostrzegam użytkownika, że ​​są niezapisane zmiany. Ładuję niektóre dane z 'loadRecord()' do formularza. Zawsze miałem brudną formę, ponieważ odkryłem, że 'reset()' tworzy niepoprawny stan po załadowaniu danych. – ChrisLo

+1

Czy czytałeś? Ale ważne jest, w którym momencie jest ładowany rekord, ponieważ jeśli formularz zostanie wyrenderowany i wyświetlony jako pusty, wartości te będą przechowywane jako "originalValue", a "reset()" przywróci tę "wartość oryginału" do pola. Argument boolean po prostu usunie odniesienie do rekordu, jeśli jest ustawione na true. Jeśli więc załadujesz rekord po zainicjalizowaniu pola, reset wyzeruje wszystkie wartości z pól, chyba że załadujesz rekord, zanim pole zostanie zinicjalizowane, lub ustawisz właściwość trackResetOnLoad na wartość true (co zastąpi wartość originalValue) – sra

1

Obejście polega na użyciu ukrytego pola i ustawieniu jego wartości, aby wymusić zabrudzenie formularza. Używamy tego w widżetach, które nie zawierają pól formularza. Aby zabrudzić formularz, po prostu zmienimy wartość ukrytego pola, aby je wyczyścić, zresetowaliśmy je do pierwotnej wartości.

Powiązane problemy