这里引用的小提琴和代码实际上并不起作用。我不知道如何在一个文件项目中定义控制器。无论如何,我的问题是当我处于控制器功能时(在我的情况下是后悔)。我无法弄清楚如何获得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]
});
}
});
答案 0 :(得分:1)
您必须在基本的JS结构中思考以找到范围。基本结构是函数Ext.Ajax.request()
,在这种情况下需要一个(!)参数。
该单个参数是一个对象。 如果您在对象中使用this
,this
会引用该对象。 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。