我有一个有状态的字段,我也将它连接到更改事件...当它的值发生变化时,我想执行一些操作。但是,因为它是一个有状态字段,所以当我返回到该视图时,change事件会触发,不幸的是,更改事件在ViewController的init方法之前触发,这意味着我将无法访问我的引用查找。
在下面的示例中,运行它,更改日期,然后重新运行应用程序...您将看到为更改显示的console.log,然后是init。我意识到我可以在init方法中设置处理程序,但这看起来很愚蠢。我也意识到我可以创建myField
作为私有var并以这种方式访问它,但这看起来也很愚蠢。是的,我可以改为选择事件,但这不是我想做的事情。有人有什么想法?这是一个example:
Ext.application({
name : 'Fiddle',
launch : function() {
Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
Ext.define('MyViewController', {
extend: 'Ext.app.ViewController',
alias: 'controller.myView',
init: function() {
console.log('init fired', this.lookupReference('myField'))
},
onChange: function(value) {
console.log('onChange fired', this.lookupReference('myField'));
}
});
Ext.define('MyView', {
extend: 'Ext.container.Container',
controller: 'myView',
renderTo: Ext.getBody(),
items: [{
xtype: 'datefield',
value: new Date(),
stateful: true,
stateId: 'blahblah',
listeners:{
change: 'onChange'
}
}, {
xtype: 'datefield',
value: new Date(),
reference: 'myField'
}]
});
Ext.create('MyView');
}
});
答案 0 :(得分:1)
您可以使用buffer
配置来延迟事件触发。
这具有在初始化控制器之后设置事件的优点。
解决方案:
listeners: {
change: {
buffer: 300,
fn: 'onChange'
}
}
替代方法是处理有状态字段的'beforestaterestore`事件,并仅在控制器初始化后应用状态值。
listeners: {
beforestaterestore: function (field, state){
var controller = field.up().getController();
Ext.Function.interceptAfter(controller, 'init', function(){
field.setValue(state.value); // update
},this);
return false;
}
}