2011-09-14 2 views
5

격자가있는 Ext.form.Panel과 격자의 각 행을 편집하기위한 일부 텍스트 필드가 있습니다. 이것은 매우 유사합니다 : http://dev.sencha.com/deploy/ext-4.0.2a/examples/writer/writer.html, 오직 AJAX가 관여하지 않습니다. 내 데이터 저장소가 로컬입니다.ExtJS에서 양식 + 격자 제출 4

표준 POST를 통해 그리드 행을 제출할 수 있습니까? 검증되고있는 그리드의 행을 편집

  1. 필드 : 나는 단순히 myForm.submit()를 할 경우

    는 두 가지 문제가 있습니다. 그들은 양식을 제출할 때 무시해야합니다.

  2. 그리드의 데이터가 제출되지 않습니다.

I 참조 유일한 해결책 든 검증되는 필드를 방지하고 각 행의 데이터를 포함하는 일부 숨겨진 필드를 생성한다. 더 좋은 옵션이 있습니까?

미리 감사드립니다.

+0

정확히 무슨 뜻인지 확실치 않습니다. 제출하려고하는 양식의 샘플을 넣으십시오. 제출 전용 프로세스 양식 필드에 할당 된 이름이 있기 때문에 격자가 무시됩니다 – nscrob

+0

일부 수정했습니다. 나는 그것이 지금 조금 더 분명하기를 바란다. 나는 또한 내가 사용했던 해결책을 추가했다. – liviucmg

답변

8

여기 내가 사용하는 솔루션입니다 :

  1. 제출시 양식에서 특정 필드를 무시하고는, 나는)합니다 (getFields을 overwritted 형태의 방법했습니다. 불쾌한, 알아. 아래 코드에서 'ignoreInMainForm'속성이있는 필드는 무시됩니다.

    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. 그리드의 데이터를 제출, 나는 내가 양식의 baseParams에 추가 한 JSON 객체의 모든 행을 인코딩합니다. 부분적으로 나를 위해 일한

    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

-의 ExtJS의 4.0.2a에 대신 할 나는 baseParams에 추가 할 수 없습니다, 그래서 대신 내가에 송신 핸들러를 트리거 :

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

어떤 일하는 것은 매력이있다. (그러나 플러그 앤 플레이가 아니다.) 폼에 숨겨진 필드 (위의 roomLinks라는 이름)를 만들고 위의 두 번째 for 루프는이를 찾아서 값을 JSONed 결과로 바꿉니다.