如何在传递给 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()
,在本例中它接受一个(!)参数。
那个单个参数是一个对象。 如果你在对象内部使用 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。
引用的 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()
,在本例中它接受一个(!)参数。
那个单个参数是一个对象。 如果你在对象内部使用 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。