我有一个包含网格和一些文本字段的Ext.form.Panel,用于编辑网格中的每一行。它非常类似于:http://dev.sencha.com/deploy/ext-4.0.2a/examples/writer/writer.html,只是没有涉及AJAX;我的数据存储是本地的。
如何通过标准POST提交网格行?
如果我只是执行myForm.submit(),则有两个问题:
正在验证用于编辑网格行的字段。提交表格时应忽略它们。
未提交网格中的数据。
我看到的唯一解决方案是以某种方式阻止对字段进行验证,并创建一些包含每行数据的隐藏字段。还有更好的选择吗?
提前谢谢!
答案 0 :(得分:8)
以下是我使用的解决方案:
为了在提交时忽略表单中的某些字段,我已经覆盖了表单的getFields()方法。讨厌,我知道。在下面的代码中,将忽略具有“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;
}
为了提交网格数据,我在单个JSON对象中对所有行进行编码,我在表单的baseParams中添加。
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 :(得分: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结果替换该值。