【发布时间】:2012-03-02 17:56:02
【问题描述】:
我按照 MVC 结构构建我的 ExtJS 4 应用程序。我想制作一个可扩展的网格 MyGrid,它具有一些我可以重复使用多次的功能。因此,我想,它应该有自己的控制器,它也被扩展,以便继承功能。这是如何正确完成的?
在下面的代码中,我说明了如何使用 MyExtendedGrid 扩展控制器 MyGrid。我意识到我正在重写 MyGrid 控制器中的 init 函数,因此它永远不会被调用。问题是否简单地通过从 MyExtendedGrid init 调用 MyGrid 中的“超级”init 或合并 control 对象来解决?这是在 MVC 精神中做到这一点的正确方法吗?如果有,怎么做?
控制器/MyGrid.js:
Ext.define('App.controller.MyGrid', {
extend: 'Ext.app.Controller',
refs: [
{
ref: 'myGridView',
selector: 'mygrid'
}
],
init: function() {
var me=this;
me.control({
'mygrid textfield[name=searchField]': {
change: function() {
var view = me.getMyGridView();
// Do something with view
}
}
});
}
});
控制器/MyExtendedGrid.js:
Ext.define('App.controller.MyExtendedGrid', {
extend: 'App.controller.MyGrid',
views: [
'grids.MyExtendedGrid'],
refs: [
{
ref: 'myExtendedGridView',
selector: 'myextendedgrid'
}
],
init: function() {
var me=this;
me.control({
'myextendedgrid': {
// Some control code
// Using getMyExtendedGridView()
}
});
}
});
查看/grids/MyGrid.js :
Ext.define('App.view.grids.MyGrid', {
extend: 'Ext.grid.Panel',
alias : 'widget.mygrid',
requires: [
],
store: '', // Not defined here
columns: [ ], // Not defined here
initComponent: function() {
var me = this;
me.tbar = [
'Search',
{
xtype: 'textfield',
name: 'searchField',
hideLabel: true,
width: 150
}
];
me.callParent(arguments);
}
});
查看/grids/MyExtendedGrid.js:
Ext.define('App.view.grids.MyExtendedGrid', {
extend: 'App.view.grids.MyGrid',
alias : 'widget.myextendedgrid',
store: 'MyStore',
columns: [
// ...
],
initComponent: function() {
var me = this;
me.bbar = [
//...
];
me.callParent(arguments);
}
});
【问题讨论】: