2

我有一个关于show事件的问题。在我的应用程序中,我正在处理painted我的面板事件,如下所示:

Ext.define('mvcTest.controller.Test', {
    extend: 'Ext.app.Controller',
    config: {
    refs: {
            panel: '#testpanel'
    },
    control:{
                panel: {
                    painted: 'onPainted'        
                }
        }
    },
    onPainted: function(){
        alert('painted');
    }
});

文档说,还有一个“显示”事件,但它根本没有被触发:

Ext.define('mvcTest.controller.Test', {
    extend: 'Ext.app.Controller',
    config: {
    refs: {
            panel: '#testpanel'
    },
    control:{
                panel: {
                    show: 'onShow'        
                }
        }
    },
    onShow: function(comp, obj){
        alert('show');
    }
});

为什么这不起作用?我知道,警报是错误的方式,但这不是问题。谢谢,迈克

4

3 回答 3

9

看来您的控制器没有错误。关键原因可能在于您的应用程序的另一部分,但是……好吧,根据我的经验:

  • painted事件直截了当。每次您的视图真正呈现在屏幕上时,都会painted启动。(注意:painted在视图的子组件完全呈现之前触发事件。换句话说,painted首先是 DOM 生成,其次。)

  • show事件不一定会触发,尤其是对于视图的初始化时间。show当您首先以某种方式隐藏视图并稍后显示时,事件会触发。

只是经验,可能会有所不同。但希望它可能对你有所帮助。

于 2012-06-04T09:32:23.467 回答
6

无法在控制器中处理“绘制”事件,因为它没有冒泡。

来自 sencha docs:此事件不可用于事件委托。相反,“painted”仅在您明确添加至少一个侦听器时才会触发,因为性能原因。您可以通过在面板中定义一个侦听器来处理它。

Ext.define('MyApp.view.MyPanel', {
  extend: 'Ext.Panel',
  config: {
  },
  listeners: {
    painted: function (element, options) {
      console.log("I've painted");
    }
  }
});

但是“show”事件可以在控制器中处理。检查您的应用程序的另一部分是否看到该控制器。(您是否提供了对您的控制器的参考?您的面板的 id 是否正确?)

于 2012-06-03T19:30:10.790 回答
0

我知道这是一个旧线程,但有人可能会发现它很有用:Sencha 最初不会触发事件“显示”和“绘制”。您需要首先触发它。

使用此代码段来监听来自控制器的事件:

Ext.define('MyApp.view.MyPanel', {
  extend: 'Ext.Panel',
  config: {
  },
  listeners: {
    painted: function (element, options) {
      this.fireEvent('painted', [element, options])
    }
  }
});
于 2017-02-07T10:39:29.033 回答