ExtJS:字段更改事件在ViewController的init之前触发

时间:2015-12-18 02:05:27

标签: javascript extjs extjs5 extjs6 stateful

我有一个有状态的字段,我也将它连接到更改事件...当它的值发生变化时,我想执行一些操作。但是,因为它是一个有状态字段,所以当我返回到该视图时,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');
    }
});

1 个答案:

答案 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;
  }
}