如何在ExtJS事件处理程序中访问类变量?

Bdf*_*dfy 5 extjs extjs4

this.getUrl = 'test';
this.items.add(
      new Ext.form.Checkbox(
            {
              listeners: {
                check: function(checkbox, checked) {
                  alert(this.getUrl);
                },
             }
       )
)
Run Code Online (Sandbox Code Playgroud)

如何this.getUrl在检查处理程序中访问?

mis*_*cko 11

我想知道为什么没有人建议显而易见,只需要使用Ext方式并使用'scope'配置属性:

this.getUrl = 'test';
this.items.add(
    new Ext.form.Checkbox(
            {
            listeners: {
                check: function(checkbox, checked) {
                    alert(this.getUrl);
                },
                scope: this
            }
    )
)
Run Code Online (Sandbox Code Playgroud)


wes*_*wes 7

事件处理程序通常从不同的范围(this值)调用.如果您想要的只是处理程序中的单个值,则词法范围是最简单的方法:

var getUrl = 'test';  // now it's just a regular variable
this.items.add(
      new Ext.form.Checkbox(
            {
              listeners: {
                check: function(checkbox, checked) {
                  alert(getUrl); // still available - lexical scope!
                },
             }
       )
)
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实希望父对象this在事件处理程序中可用,则可以使用Ext.Function.bind以修改范围:

this.getUrl='test';
this.items.add(
      new Ext.form.Checkbox(
            {
              listeners: {
                check: Ext.Function.bind( function(checkbox, checked) {
                  alert(this.getUrl);
                }, this ),  // second arg tells bind what to use for 'this'
             }
       )
)
Run Code Online (Sandbox Code Playgroud)

更新:Ext.Function.bind是一个ExtJS 4功能.如果您使用的是ExtJS 3.x或更低版本,则可以使用Function.createDelegate相同的结尾:

this.getUrl='test';
this.items.add(
      new Ext.form.Checkbox(
            {
              listeners: {
                check: function(checkbox, checked) {
                  alert(this.getUrl);
                }.createDelegate(this)
             }
       )
)
Run Code Online (Sandbox Code Playgroud)


Abd*_*oof 4

有多种方式可以访问该属性getUrl。以下是一些可能的选择:

1. 使用 Ext.getCmp:如果您为 FormPanel (或您正在使用的其他 extjs 组件)设置了idExt.getCmp ,则可以使用Ext.getCmp()方法访问它。所以,

 var yourComponent = Ext.getCmp('yourComponentId');
 alert(yourComponent.getUrl);
Run Code Online (Sandbox Code Playgroud)

2.使用OwnerCt属性:如果您需要访问父容器(如果父容器持有您的复选框),您可以通过公共属性访问父容器OwnerCt

3. 使用 refOwner 属性:如果您在代码中使用refsystem,则可以利用此属性来获取容器并访问所需的变量。

我认为您很容易选择第一个选项。