listeners中为什么调不到this.onXXX方法

[code="java"]
var form = new Ext.FormPanel({
items: [{
fieldLabel: 'First Name',
name: 'first',
allowBlank:false
}],
listeners:{
'render':this.onRender,scope:this
},
onRender:function(){
alert("onRender....");
}
});
[/code]

请教一下 为什么不能调用到onRender呢?

报:

this.onRender is not a function
error source line: [Break on this error] this.onRender();\r\n
[b]问题补充:[/b]
谢谢几位的回答,

第一眼看:
[code="java"]
var form = new Ext.FormPanel({
items: [{
fieldLabel: 'First Name',
name: 'first',
allowBlank:false
}],
listeners:{
'render':form.onRender,scope:form
},
onRender:function(){
alert("onRender....");
}
});
[/code]

我觉得这样写一定可以,结果运行报:
[code="java"]
form is undefined
error source line: [Break on this error] 'render':form.onRender,scope:form\r\n
[/code]

我修改成:
[code="java"]
var form = new Ext.FormPanel({
items: [{
fieldLabel: 'First Name',
name: 'first',
allowBlank:false
}],
listeners:{
'render':this.onRender2,scope:form
},
onRender2:function() {
alert("onRender....");
}
});
[/code]
结果也不行 报:
x is undefined
error source line: [Break on this error] Ext.DomHelper=function(){var s=null,j=/^....stopEvent();this.completeEdit()}}}});\r\n

form担心关键字,改成_form也一样。

onRender担心关键字 改成 onRender2也一样。

[b]问题补充:[/b]
[quote]不用那么复杂,直接

Java代码
listeners:{

'render':function(){

this.onRender2()

}

} [/quote]

我知道这样说可以的,我就想知道 像我那个思路写 究竟该怎么改。

没办法.

这时候,form这个对象还没有创建,所以form.XXX肯定是不行的.
而this.XXX呢,在定义的时候,这个this是属于外面的闭包的,所以也不行.

那你这个onRender2一个form内部的函数,而在此时form是没有可用的引用的.

要不你就那样做,要不你就不用listeners,而是在外面form.on

1.onRender这个函数名最好改改,这是内部用到的,别覆盖了

至于this报错是因为:

listeners:{

'render':this.onRender,scope:this

}

onRender是属于form的,你把scope改为this。。。 this这时候是你定义form的那个闭包,自然找不到

这就是js里的this作用域问题了
http://blog.csdn.net/hzrui/archive/2009/02/27/3941137.aspx

        var form = new Ext.FormPanel({
            items: [{
                fieldLabel: 'First Name',
                name: 'first',
                allowBlank:false
            }],
            listeners:{
                'render':[color=red]form.onRender,scope:form[/color]
            },
            onRender:function(){
                alert("onRender....");
            }
        });

这样写应该可以

可能onRender不是直接做为FormPanel的属性公开的,所以得不到

不用那么复杂,直接

[code="java"]listeners:{
'render':function(){
this.onRender2()
}
}[/code]