2011-09-14 23 views
5

Mam plik Ext.form.Panel zawierający siatkę i niektóre pola tekstowe do edycji każdego wiersza w siatce. Jest bardzo podobny do tego: http://dev.sencha.com/deploy/ext-4.0.2a/examples/writer/writer.html, tylko że nie ma w tym udziału AJAX; mój magazyn danych jest lokalny.Przesyłanie formularza + siatki w ExtJS 4

Jak mogę przesłać wiersze siatki za pomocą standardowego testu POST?

Gdybym po prostu zrobić myForm.submit(), istnieją dwa problemy:

  1. Pola do edycji wierszy w siatce są zatwierdzone. Należy je zignorować podczas przesyłania formularza.

  2. Brak danych z sieci.

Jedynym rozwiązaniem, które widzę, jest uniemożliwienie walidacji pól i utworzenie ukrytych pól zawierających dane z każdego wiersza. Czy jest jakaś lepsza opcja?

Z góry dziękuję!

+0

nie jest jasne, co dokładnie masz na myśli ... może umieścić próbkę formularza, który próbujesz przesłać. A siatka jest ignorowana, ponieważ przesłanie przetwarza tylko pola formularza, które mają nazwę przypisaną – nscrob

+0

Wprowadziłem pewne zmiany. Mam nadzieję, że teraz jest trochę jaśniej. Dodałem również rozwiązanie, którego używałem. – liviucmg

Odpowiedz

8

Oto rozwiązanie użyłem:

  1. za ignorowanie pewnych pól z formularza po złożeniu, mam overwritted z getFields() metoda formularza. Paskudne, wiem. W poniższym kodzie pola z właściwością ignoreInMainForm zostaną zignorowane.

    Ext.getCmp('myForm').getForm().getFields = function() { 
        var fields = this._fields; 
        if (!fields) { 
         var s = [], 
         t = this.owner.query('[isFormField]'); 
         for (var i in t) { 
          if (t[i]['ignoreInMainForm'] !== true) { 
           s.push(t[i]); 
          } 
         } 
         fields = this._fields = Ext.create('Ext.util.MixedCollection'); 
         fields.addAll(s); 
        } 
        return fields; 
    } 
    
  2. składania danych siatki, w I kodować wszystkie wiersze w jeden obiekt JSON, że dodać w baseParams formularza.

    var myItems = myStore.getRange(); 
    var myJson = []; 
    for (var i in myItems) { 
        myJson.push({ 
         'a': myItems[i].get('a'), 
         'b': myItems[i].get('b'), 
         ... 
        }); 
    } 
    Ext.getCmp('formHiddenId').setValue(Ext.encode(myJson)); 
    
1

które częściowo pracował dla mnie - w ExtJS 4.0.2a, nie mogę dodać do baseParams, więc zamiast tego wywołał obsługi Prześlij zamiast zrobić:

function prepareToSendForm(a, b) { 
var myItems = Ext.getCmp('grid-links').store.getRange(); 
var myJson = []; 
for (var i in myItems) { 
    myJson.push({ 
     'title': myItems[i].get('title'), 
     'url': myItems[i].get('url'), 
     'refreshes': myItems[i].get('refreshes') 
    }); 
} 

//Update the hidden field to be the JSON of the Grid 
for (var i=0, len=Ext.getCmp('roomCreateForm').getForm()._fields.items.length; i<len; i++) { 
    var item = Ext.getCmp('roomCreateForm').getForm()._fields.items[i]; 
    if (item.name=='roomLinks') { 
     Ext.getCmp('roomCreateForm').getForm()._fields.items[i].inputEl.dom.value=Ext.encode(myJson); 
     break; 
    } 
} 

Ext.getCmp('roomCreateForm').submit(); 
} 

Która pracował (a nie jest bardzo plug-and-play). Musiałem stworzyć ukryte pole (o nazwie roomLinks powyżej) w formie, a druga pętla dla powyższego znajduje to i zastępuje wartość wynikami JSONed.

Powiązane problemy