我希望有一个事件监听器,能够在表单(即Ext.form.Panel)中任何字段发生更改时触发。然而,Ext.form.Panel类本身不会触发此类事件。
如何最好地监听表单中所有字段的“change”事件?
更新:根据评论中的提示添加了第三个选项(感谢@innerJL!)
好的,看起来至少有两种相当简单的方法可以实现它。
选项1) 为添加到表单的每个字段添加一个“更改”监听器:
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);
}
}
}
});
这种方法至少有一个很大的缺点;如果您将某些字段“包装”在其他容器中,然后将这些容器添加到表单中,它将无法识别嵌套的字段。换句话说,它不会通过组件进行“深度”搜索,以查看是否包含需要“更改”侦听器的表单字段。
选项2) 使用组件查询来侦听容器中所有字段触发的“更改”事件。
Ext.define('myapp.MyController', {
extend: 'Ext.app.Controller',
...
init: function(application) {
me.control({
'[xtype="myapp.MyFormPanel"] field': {
change: function() {
// Do something
}
}
});
}
});
选项 3) 监听表单面板的基本表单(Ext.form.Basic)触发的 'dirtychange'。 重要提示: 您需要通过确保将 {trackResetOnLoad:true} 传递给您的表单面板构造函数来启用 'trackResetOnLoad'。
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
}
});
}
});
这种方法是最“聪明”的,它不仅可以让您知道表单何时被修改,还可以判断用户是否将其改回到原始状态。例如,如果他们将文本字段从“Foo”更改为“Bar”,则“dirtychange”事件将以isDirty参数为true的方式触发。但是,如果用户随后将该字段改回“Foo”,则“dirtychange”事件将再次触发,并且isDirty将为false。
change
监听器添加到表单的默认配置中即可:Ext.create('Ext.form.Panel', {
// ...
defaults: {
listeners: {
change: function(field, newVal, oldVal) {
//alert(newVal);
}
}
},
// ...
});
fieldDefaults
,它会正确地传播到字段组。 - Steve Dodier-Lazaro