如何在ExtJS 6 Controller中设置范围传递给ajax.request

时间:2016-05-16 21:50:07

标签: extjs extjs5

这里引用的小提琴和代码实际上并不起作用。我不知道如何在一个文件项目中定义控制器。无论如何,我的问题是当我处于控制器功能时(在我的情况下是后悔)。我无法弄清楚如何获得testval的引用。如果我在一个单独的启动中创建一个只有第19-32行的简单示例就可以了(参见小提琴:https://fiddle.sencha.com/#fiddle/1ae7)。

然而,在我的控制器案例中,我没有在我的成功或失败事件中得到testval。如何传递我的函数的上下文(范围)我从?

调用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]
        });

    }
});

1 个答案:

答案 0 :(得分:1)

您必须在基本的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