2012-10-27 79 views
0

我使用ExtJs4.1,这里是我的例子。该 “calendarioChange” 不叫这样:为什么我的事件处理程序不叫

Ext.define('App.view.atendimento.Agenda', { 
    extend: 'Ext.window.Window', 
    maximized: true, 
    bodyPadding: 4, 
    constrain: true, 
    layout: 'hbox', 
    items:[ 
    { 
     xtype: 'container', 
     width: 300, 
     layout: 'vbox', 
     items: [ 
      { 
       xtype: 'datepicker', 
       handler: this.calendarioChange 
      } 
     ] 
    } 
    ], 
    calendarioChange: function(picker, date){ 
    alert('changed'); 
    } 
}); 

但thsi方式运行:

xtype: 'datepicker', 
    handler: function(picker, date){ 
        alert('changed'); 
       } 

什么I'm在第一种情况下失踪了?

谢谢。

回答

0

因为您定义为事件处理程序的方法不在this范围内。例如,您可以在Ext.define()调用之外声明该方法,然后仅通过名称来引用它。

+0

我不能得到这个工作。 – Beetlejuice

1

问题是你没有考虑到你的句柄的范围。每次嵌套构造函数时,都会更改“this”指针。你的情况:

this.calendarioChange 

,因为“这个”被指向日期选择器没有窗口无法正常工作。你可以通过在找到窗口的情况下添加一个函数来解决它,然后调用适当的方法:

items: [ 
      { 
       xtype: 'datepicker', 
       handler: function(picker, date) { 
        var window = this.up('window'); 
        window.calendarioChange(picker, date); 
       } 
      } 
... 
+0

这有效,但看起来太冗长。 – Beetlejuice

+0

是的,但它不是大型应用程序的首选解决方案。使用Sencha MVC可能更优雅,因为该行为将在控制器中实现,在这种情况下,您没有嵌套对象 – Israel

相关问题