Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ExtJS:范围混淆 来自C++背景,在JavaScript/ExtJS函数范围内,我有点迷失了——特别是在处理事件时。p>_Javascript_Extjs_Scope_Extjs4 - Fatal编程技术网

ExtJS:范围混淆 来自C++背景,在JavaScript/ExtJS函数范围内,我有点迷失了——特别是在处理事件时。p>

ExtJS:范围混淆 来自C++背景,在JavaScript/ExtJS函数范围内,我有点迷失了——特别是在处理事件时。p>,javascript,extjs,scope,extjs4,Javascript,Extjs,Scope,Extjs4,假设我有一个控制器,可以监听许多不同的事件。这些事件可能来自托管视图、存储、应用程序级别等。目前,我正在这样做以确保正确的范围: init: function() { me.control({ 'someSelector': { someEvent: me.onSomeEvent.bind(me) }, ... }); me.application.on({ applicationEv

假设我有一个控制器,可以监听许多不同的事件。这些事件可能来自托管视图、存储、应用程序级别等。目前,我正在这样做以确保正确的范围:

init: function() {
    me.control({
        'someSelector': {
            someEvent: me.onSomeEvent.bind(me)
        },
        ...
    });
    me.application.on({
        applicationEvent: me.onApplicationEvent.bind(me)
    });
},
onSomeEvent: function() {...},
onApplicationEvent: function() {...},
这是正确的做事方式吗?我害怕在SomeEvent()和ApplicationEvent中使用
这个
,除非我明确知道这个指向什么。想法

编辑:下面是一些示例代码,以显示此可能误导的地方

init: function() {
    this.control({
        'uploadform *': {
            formUpload: this.onFormUpload
        }
    });
},

onFormUpload: function(form) {
    if(form.isValid()) {
        var formData = form.getValues();
        Ext.Ajax.request({
            url: 'upload',
            method: 'POST',
            jsonData: {
                form: formData
            },
            success: this.onFormUploadSuccess // here, this is the controller
        });
    }
},

onFormUploadSuccess: function() {
    ...                                       // here, this isn't the controller
    this.application.fireEvent('dealAdded');  // this.application === undefined!!
}

虽然JS中的作用域可能会让人困惑,但不要害怕。 您的控制器维护作用域,所以您不需要修改代码。应该是这样的:

Ext.define('Pandora.controller.Station', {
    extend: 'Ext.app.Controller',
    ...    
    init: function() {
        this.control({
            'stationslist': {
                selectionchange: this.onStationSelect
            },
            ...
        });
    },    
    ...    
    onStationSelect: function(selModel, selection) {
        this.application.fireEvent('stationstart', selection[0]);
    },    
   ...
});
这里有一篇优秀的事件处理文章:。 此外,当某些东西看起来不对劲时,我会求助于
console.log(this)
,以确保我看到的是正确的范围

编辑 看到您提供的示例后,问题不在控制器本身,而是在默认情况下异步并在窗口范围内执行的Ajax请求中。ExtJS允许您在请求中使用
scope:this
config设置作用域,这将把控制器设置为成功回调的作用域

Ext.Ajax.request({
            url: 'upload',
            method: 'POST',
            jsonData: {
                form: formData
            },
            success: this.onFormUploadSuccess // here, this is the controller
     ,scope:this
        });

在您的示例中,对于
onStationSelect
,您无法保证此指向的是什么。我有一个确切的问题,
this.application
是未定义的
(this.onStationSelect)
解析为一个函数(在本例中,
onStationSelect
),它是通过一些任意上下文调用的。这是否等同于执行
成功:this.onFormUploadSuccess.bind(this)
?后续:。。。什么更好<代码>绑定
范围
?我发现绑定令人困惑。设置范围非常明确,我确信它确实在幕后绑定:)