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)
?后续:。。。什么更好<代码>绑定
或范围
?我发现绑定令人困惑。设置范围非常明确,我确信它确实在幕后绑定:)