JS & EXT JS:函数作用域内的函数误解

发布于 2024-12-11 00:39:11 字数 1342 浏览 0 评论 0原文

我在使用以下代码时遇到了一些问题:

Ext.define('...controller...', {
extend: 'Ext.app.Controller',

init: function() {
    ...
},

crearLoginWindow:function(){

    var loginWindow = Ext.create('Proto1.view.adminbd.LoginWindowBDView', {
        itemId: 'loginwindow',
        autoShow: true,
        modal: true
    });

    Ext.ComponentQuery.query('#loginwindow > button[text="Cancelar"]')[0].on('click', function(){loginWindow.close()});

    //Cant call 'enviarLogin' function if its inside 'crearLoginWindow'
    Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this);

    var enviarLogin = function(){
        console.log('login')
    }

}

});

我希望能够在“crearLoginWindow”函数中调用“enviarLogin”,但它会引发引用错误。如果该函数放置在“crearLoginWindow”之外,它将起作用。

这两行是麻烦的根源:

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this);

var enviarLogin = function(){
    console.log('login')
}  

我尝试了不同的范围变体,例如;

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.crearLoginWindow.enviarLogin);
this.enviarLogin = function(){
    console.log('login')
}  

这与我认为我对范围的理解以及指定函数所在位置的需要是有道理的。

我很感激一个解决方案,因为这个问题使我的代码非常混乱!

im having some trouble with the following code:

Ext.define('...controller...', {
extend: 'Ext.app.Controller',

init: function() {
    ...
},

crearLoginWindow:function(){

    var loginWindow = Ext.create('Proto1.view.adminbd.LoginWindowBDView', {
        itemId: 'loginwindow',
        autoShow: true,
        modal: true
    });

    Ext.ComponentQuery.query('#loginwindow > button[text="Cancelar"]')[0].on('click', function(){loginWindow.close()});

    //Cant call 'enviarLogin' function if its inside 'crearLoginWindow'
    Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this);

    var enviarLogin = function(){
        console.log('login')
    }

}

});

I want to be able to call 'enviarLogin' inside 'crearLoginWindow' function but it throws a reference error. If the function is placed outside 'crearLoginWindow' it will work.

Being these two lines the source of trouble:

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.enviarLogin, this);

var enviarLogin = function(){
    console.log('login')
}  

I've tried different scope variants such as;

Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0].on('click', this.crearLoginWindow.enviarLogin);
this.enviarLogin = function(){
    console.log('login')
}  

Which makes sense with what i think i understand about scope and the need to specify the place where the function resides to execute it.

Id appreciate a solution because this problem makes my code very messy!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

原来分手还会想你 2024-12-18 00:39:11

简单地在另一个函数中定义一个函数不会将其附加到任何对象或实例,因此 this.enviarLogin 将不起作用。这里有两个基本选项:

  1. 只需定义您正在执行的内部函数(将其移至处理程序分配之上),并直接按名称引用它:

    var enviraLogin = function(){
        console.log('登录')
    };
    
    Ext.ComponentQuery.query('#loginwindow > 按钮[text="Conectar"]')[0]
        .on('点击', enviraLogin);
    
  2. 将 enviarLogin 定义为方法,与定义 crearLoginWindow 的方式相同:

    Ext.define('...控制器...', {
        扩展:'Ext.app.Controller',
    
        初始化:函数(){...},
    
        创建登录窗口:函数(){
            // ...
    
            Ext.ComponentQuery.query('#loginwindow > 按钮[text="Conectar"]')[0]
                .on('点击', this.enviarLogin, this);
        },
    
        环境登录:函数(){
            console.log('登录')
        }
    
    });
    

如果不需要引用,第一个版本可能会更好enviarLogincrearLoginWindow 方法之外。如果您确实需要在其他地方引用 enviarLogin,则第二种更好,并且它使得在 enviarLogin 中使用 this 更加清晰。

Simply defining a function within another function doesn't attach it to any object or instance, so this.enviarLogin won't work. There are two basic options here:

  1. Just define the inner function as you're doing (moving it up above your handler assignment), and reference it directly by name:

    var enviarLogin = function(){
        console.log('login')
    };
    
    Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0]
        .on('click', enviarLogin);
    
  2. Define enviarLogin as a method, the same way you are defining crearLoginWindow:

    Ext.define('...controller...', {
        extend: 'Ext.app.Controller',
    
        init: function() { ... },
    
        crearLoginWindow: function(){
            // ...
    
            Ext.ComponentQuery.query('#loginwindow > button[text="Conectar"]')[0]
                .on('click', this.enviarLogin, this);
        },
    
        enviarLogin: function(){
            console.log('login')
        }
    
    });
    

The first version may be better if you don't need to reference enviarLogin outside of the crearLoginWindow method. The second is better if you do need to reference enviarLogin elsewhere, and it makes using this in enviarLogin clearer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文