GeoExt:通过更改字段名称更改过滤器
GeoExt: Change Filter via changing field name
在 GeoExt 2 中,我有一个包含一个字段和 2 个单选按钮的表单。我对单选按钮进行编码以更改该字段的名称以符合 GeoExt 的约定。
items: [
{
xtype: "numberfield",
itemId: 'parcel',
name: 'parcelAtt__ge',
fieldLabel: 'Parcel Number:'
},
{
xtype: 'radiogroup',
fieldLabel: 'Search type:',
columns: 2,
vertical:true,
items: [
{
boxLabel: 'greater than',
name: 'option',
inputValue: '1',
submitValue: false,
checked: true,
listeners: {
change: function (field, newValue, oldValue) {
if (newValue) myPanel.down('#parcel').inputEl.dom.name = 'parcelAtt__ge';
}
}
},
{
boxLabel: 'lower then',
name: 'option',
inputValue: '2',
submitValue: false,
listeners: {
change: function (field, newValue, oldValue) {
if (newValue) myPanel.down('#parcel').inputEl.dom.name = 'parcelAtt__le';
}
}
},
]
}
],
我可以确认(通过 Firebug)上面的代码更改了 HTML 中的字段名称,但是在提交表单时,GeoExt 在设置 OpenLayers 过滤器时没有使用新的字段名称。
有什么提示或解决办法吗?
我发现了我的错误。我不应该直接更改 Dom 元素。相反,我不得不为字段添加一个 setName 方法,如下所示(令人惊讶的是,Ext JS 5.1 默认只提供 getName 方法):
Ext.define('MyApp.form.field.Base', {
override: 'Ext.form.field.Base',
setName: function(name) {
this.name = name;
}
});
然后在单选按钮的事件处理程序中使用该方法,如下所示:
if (newValue) myPanel.down('#parcel').setName('parcelAtt__ge');
除非您的表单中有文件上传字段,否则 ExtJS 根本不使用 HTML 表单提交,因此不使用输入元素的名称。
两种可能的解决方案:
要不你试试能不能在字段上使用setName
函数:
myPanel.down('#parcel').setName('parcelAtt__le')
或者您必须使用两个具有预定义名称的字段,并同步它们之间的值:
items: [{
xtype: "numberfield",
itemId: 'parcelGe',
name: 'parcelAtt__ge',
fieldLabel: 'Parcel Number:'
},{
xtype: "numberfield",
hidden: true,
itemId: 'parcelLe',
name: 'parcelAtt__le',
fieldLabel: 'Parcel Number:'
},{
xtype: 'radiogroup',
fieldLabel: 'Search type:',
columns: 2,
vertical:true,
simpleValue: true,
items: [{
boxLabel: 'greater than',
name: 'option',
inputValue: 'ge',
submitValue: false,
checked: true
},{
boxLabel: 'lower than',
name: 'option',
inputValue: 'le',
submitValue: false
}],
listeners: {
change: function (field, newValue, oldValue) {
var leField = myPanel.query('#parcelLe'),
geField = myPanel.query('#parcelGe');
if(newValue=='le') {
leField.show();
geField.hide();
leField.setValue(geField.getValue());
}
else if(newValue=='ge') {
geField.show();
leField.hide();
geField.setValue(leField.getValue());
}
}
}
}],
在 GeoExt 2 中,我有一个包含一个字段和 2 个单选按钮的表单。我对单选按钮进行编码以更改该字段的名称以符合 GeoExt 的约定。
items: [
{
xtype: "numberfield",
itemId: 'parcel',
name: 'parcelAtt__ge',
fieldLabel: 'Parcel Number:'
},
{
xtype: 'radiogroup',
fieldLabel: 'Search type:',
columns: 2,
vertical:true,
items: [
{
boxLabel: 'greater than',
name: 'option',
inputValue: '1',
submitValue: false,
checked: true,
listeners: {
change: function (field, newValue, oldValue) {
if (newValue) myPanel.down('#parcel').inputEl.dom.name = 'parcelAtt__ge';
}
}
},
{
boxLabel: 'lower then',
name: 'option',
inputValue: '2',
submitValue: false,
listeners: {
change: function (field, newValue, oldValue) {
if (newValue) myPanel.down('#parcel').inputEl.dom.name = 'parcelAtt__le';
}
}
},
]
}
],
我可以确认(通过 Firebug)上面的代码更改了 HTML 中的字段名称,但是在提交表单时,GeoExt 在设置 OpenLayers 过滤器时没有使用新的字段名称。
有什么提示或解决办法吗?
我发现了我的错误。我不应该直接更改 Dom 元素。相反,我不得不为字段添加一个 setName 方法,如下所示(令人惊讶的是,Ext JS 5.1 默认只提供 getName 方法):
Ext.define('MyApp.form.field.Base', {
override: 'Ext.form.field.Base',
setName: function(name) {
this.name = name;
}
});
然后在单选按钮的事件处理程序中使用该方法,如下所示:
if (newValue) myPanel.down('#parcel').setName('parcelAtt__ge');
除非您的表单中有文件上传字段,否则 ExtJS 根本不使用 HTML 表单提交,因此不使用输入元素的名称。
两种可能的解决方案:
要不你试试能不能在字段上使用setName
函数:
myPanel.down('#parcel').setName('parcelAtt__le')
或者您必须使用两个具有预定义名称的字段,并同步它们之间的值:
items: [{
xtype: "numberfield",
itemId: 'parcelGe',
name: 'parcelAtt__ge',
fieldLabel: 'Parcel Number:'
},{
xtype: "numberfield",
hidden: true,
itemId: 'parcelLe',
name: 'parcelAtt__le',
fieldLabel: 'Parcel Number:'
},{
xtype: 'radiogroup',
fieldLabel: 'Search type:',
columns: 2,
vertical:true,
simpleValue: true,
items: [{
boxLabel: 'greater than',
name: 'option',
inputValue: 'ge',
submitValue: false,
checked: true
},{
boxLabel: 'lower than',
name: 'option',
inputValue: 'le',
submitValue: false
}],
listeners: {
change: function (field, newValue, oldValue) {
var leField = myPanel.query('#parcelLe'),
geField = myPanel.query('#parcelGe');
if(newValue=='le') {
leField.show();
geField.hide();
leField.setValue(geField.getValue());
}
else if(newValue=='ge') {
geField.show();
leField.hide();
geField.setValue(leField.getValue());
}
}
}
}],