问题描述
GridPanel = Ext.extend(Ext.grid.GridPanel, {_store : null,// 构造方法constructor : function(_config) {if (_config == null) {_config = null;}Ext.apply(this, _config);this._store = new Ext.data.JsonStore({data : [{name : "张三",sex : "男",age : 11}, {name : "李四",sex : "女",age : 10}],fields : ["name", "sex", "age"]});// 拷贝父类的构造方法到当前对象ViewForm.superclass.constructor.call(this, {width : 300,autoHeight : true,store : this._store,renderTo : Ext.getBody(),// 取消标题下拉选项enableHdMenu : false,// 禁止拖动enableColumnMove : false,// 定义单选 selModel可简写smsm : new Ext.grid.RowSelectionModel({singleSelect : true,listeners : {"rowselect" : {fn : function(_sm, _index,_data) {this.fireEvent("rowse",_data);},scope : this}}}),// colModel 可简写cmcm : new Ext.grid.ColumnModel([{header : "姓名",align : "center",sortable : true,dataIndex : "name"}, {header : "性别",align : "center",sortable : true,dataIndex : "sex"}, {header : "年龄",align : "center",sortable : true,dataIndex : "age"}])});this.addEvents("rowse");}});以下是调用Ext.onReady(function() {var _grid = new GridPanel();_grid.on("rowse", function(_data) {_form.loadRecord(_data);});});如果代码没scope : this,则_grid.on无法监听请解答下为什么.3Q
解决方案
function(_sm, _index, _data) { this.fireEvent("rowse", _data); }如果只看上面一段,你就会知道this是指这个function的内部作用域。那么这个域内部有fireEvent方法吗?当然没有。Extjs的scope:this是将上面的function内this作用域改变为整个控件的作用域。至于怎么实现的,你可以参考源码实现。其本质就是call与apply的调用。
解决方案二:
fn : function(_sm, _index, _data) {