如何在传递给 ajax.request 的 ExtJS 6 控制器中设置范围

How to set scope in ExtJS 6 Controller passing to ajax.request

引用的 fiddle 和此处的代码实际上不起作用。我不知道如何在一个文件项目中定义一个控制器。无论如何,我的问题是当我处于控制器功能时(在我的情况下是后渲染)。我不知道如何获得对 testval 的引用。如果我在单独的启动中创建一个仅包含第 19-32 行的简单示例(请参阅 fiddle: https://fiddle.sencha.com/#fiddle/1ae7)。

但是,在我的控制器案例中,我没有在成功或失败事件中获得测试值。如何传入我正在调用 ajax 请求的函数的上下文(范围)?

https://fiddle.sencha.com/#fiddle/1ae9

Ext.define('mycontroller', {
    extend: 'Ext.app.Controller',
    alias: 'controller.main',
    myfun: function() {
        console.log('controller:myfun');
    }
});



var mypanel = Ext.create('Ext.panel.Panel', {
    controller: {
        type: 'main'
    },
    listeners: {
        afterrender: function() {
            console.log('afterrender');

            var testval = "hi there";

            Ext.Ajax.request({
                method: 'POST',
                url: '/dummy',
                jsonData: 'jsonData',
                scope: this,
                success: function() {
                    // this never gets called, just testing scope
                },
                failure: function() {
                    // testval   IS NOT IN SCOPE, CONFUSED ABOUT SCOPE AND THIS HERE
                    Ext.Msg.alert('info', testval);
                }
            });
        }
    },
    html: 'test panel'
});


Ext.application({
    name: 'Fiddle',

    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'fit',
            items: [mypanel]
        });

    }
});

您必须考虑基本的 JS 结构才能找到作用域。基本结构是一个函数 Ext.Ajax.request(),在本例中它接受一个(!)参数。

那个单个参数是一个对象。 如果你在对象内部使用 thisthis 指的是那个对象。 Sencha 用来将外部作用域转移到函数中的模式是

var me = this;
Ext.Ajax.request({
    ...
    scope: me,
    ...
});

也就是说,var testvar 是一个局部变量,它的作用域不在任何对象中——它在功能块中。

        var testval = "hi there";

        Ext.Ajax.request({
            failure: function() {
                // testval IS ALWAYS "IN SCOPE" HERE, NO MATTER WHAT YOU SET scope TO,
                // BECAUSE IT IS DEFINED INSIDE THE SAME FUNCTION BLOCK
                Ext.Msg.alert('info', testval);
            }
        });

也就是说,I have made a working fiddle for you by just fixing the error I found in browser console