2011-12-19 4 views

Odpowiedz

18

Aktualizacja (!) Dzięki @innerJL Dodano 3rd opcję opartą na końcówkę w komentarzach

Ok, wygląda istnieje przynajmniej dwa dość proste sposoby, aby to zrobić.

wariant 1) Dodaj „zmiany” słuchacza dla każdego pola, które dodaje się do postaci:

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

ta ma co najmniej jedną wielką wadę; jeśli "zawiniesz" niektóre pola w innych kontenerach, a następnie dodasz te pojemniki do formularza, nie rozpoznasz zagnieżdżonych pól. Innymi słowy, nie wykonuje "głębokiego" przeszukiwania komponentu, aby zobaczyć, czy zawiera ono pole formularza, które wymaga "zmiany" słuchaczy.

Opcja 2) Użyj zapytania komponentu, aby wysłuchać wszystkich zdarzeń "zmian" wystrzelonych z pól w kontenerze.

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

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

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

Opcja 3) Posłuchaj dla 'dirtychange' wystrzelonego z bazowego 'podstawowego' postaci panelu w formularzu (Ext.form.Basic). Ważne: Musisz upewnić się, że musisz włączyć opcję "trackResetOnLoad", upewniając się, że {trackResetOnLoad: true} jest przekazywane do konstruktora panelu formularzy.

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

To podejście jest "najmądrzejsze"; pozwala na poznanie, kiedy formularz został zmodyfikowany, ale także, jeśli użytkownik zmodyfikuje go z powrotem do jego oryginalnego stanu. Na przykład, jeśli zmienią pole tekstowe z "Foo" na "Bar", zdarzenie "brudne zmiany" będzie wyświetlało "true" dla parametru isDirty. Ale jeśli użytkownik zmieni następnie pole z powrotem na na "Foo", zdarzenie "brudne zmiany" będzie ponownie uruchamiać i będzieDirty będzie fałszywe.

+1

może to wydarzenie BasicForm (yourForm.getForm()) może być przydatna dla Ciebie http://docs.sencha.com/ext-js/4-0/ #!/api/Ext.form.Basic-event-dirtychange –

+0

Jeśli ktokolwiek ma rozwiązanie dla ExtJs 3, byłbym zainteresowany. – gunnx

+1

Uważaj na trzecią opcję. Listener zostanie wywołany tylko wtedy, gdy zmieni się właściwość 'isDirty'. Oznacza to, że jeśli masz pole tekstowe z wartością "Foo" i użytkownik zmieni tę wartość na "Bar" - zostanie wywołana "brudośćzmiany". Ale jeśli użytkownik zmieni wartość ponownie na "Pool", 'dirtychange' NIE zostanie wyzwolony, ponieważ właściwość' isDirty' jest już 'prawdą' –

6

Chcę uzupełnić odpowiedź Clinta. Jest jeszcze jedno podejście (i myślę, że to jest najlepsze dla twojego problemu). Wystarczy dodać change słuchacza do formularza domyślne config:

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

Dzięki za dane! W moim przypadku potrzebuję niestandardowej klasy, która rozszerza panel formularza; również chcę tylko wiedzieć, kiedy pole zmienia się z pierwotnej wartości ("brudizmie" vs."zmiana"), ale może to być świetną wskazówką dla innych scenariuszy, w których te dwa wymagania nie mają zastosowania. –

+0

Nie ma takiego zdarzenia zmiany w panelu formularza, ani go nie słucha. – Marshal

+2

@Marshal. Nie napisałem, że ta forma ma takie wydarzenie. Pola formularza mają takie zdarzenia. W moim przykładzie handler NIE został przypisany do formularza. Został przypisany do wszystkich pól formularza. Zobacz konfigurację [defaults] (http://docs.sencha.com/extjs/4.2.0/#!/api/Ext.form.Panel-cfg-defaults). –

Powiązane problemy