Extjs 4-插件类应用程序中的名称空间
我有一个包含多个模块/插件的模块化应用程序,也可以作为独立应用程序运行 我将Extjs 4-插件类应用程序中的名称空间,extjs,extjs4,extjs-mvc,Extjs,Extjs4,Extjs Mvc,我有一个包含多个模块/插件的模块化应用程序,也可以作为独立应用程序运行 我将模块/插件控制器动态注册到主应用程序,下面是步骤中的问题 我的主应用程序有一个前缀-其控制器“A.controller.AppController” 我的插件有B前缀-它的控制器:B.controller.PortalController 插件控制器代码: Ext.define('B.controller.PortalController', { extend: 'Ext.app.Controller',
模块/插件
控制器动态注册到主应用程序,下面是步骤中的问题
- 我的主应用程序有一个前缀-其控制器“A.controller.AppController”
- 我的插件有B前缀-它的控制器:B.controller.PortalController
Ext.define('B.controller.PortalController', {
extend: 'Ext.app.Controller',
views: [
'portal.MapPanel',
'administration.ConfigPanel',
'administration.ConfigPanelWrapper'
],
//stores:['Test'],
init: function() {
console.log('portal controller init');
//console.log(this.getTestStore());
this.control({
});
}
});
视图以B前缀正确注册,Ext.Loader
loadesB.view.portal.MapPanel
,但未加载存储
如果我指定stores:['Test']
它会尝试加载A.store.Test
,如果我指定Test.Test
它什么都不做(比如错误,但是ext-all-debug不会捕获它),如果我指定stores:['B.store.Test']
它会正确加载它,但现在我必须使用getBStoreTestStore()
获取将导致大量代码更改的门店参考
如何使控制器加载具有适当前缀的存储?如果没有覆盖,我认为这是不可能的。更重要的是,对于我的视图,它也不应该工作
ext All debug.js中的所有代码
控制器使用其自己的类名使用适当的前缀正确加载类:
namespace = Ext.Loader.getPrefix(className) || match[1];
namespaceAndModule = namespace + '.' + module + '.'
但对于每个视图、存储、模型,其控制器都会创建一个getter,将名称传递给getStore、getView、getModel函数
if (!this[fn]) {
this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
}
getter传入的getStore函数返回应用程序存储:
getStore: function(name) {
return this.application.getStore(name);
},
应用程序本身使用getModuleClassName解析类名
getModuleClassName: function(name, module) {
if (name.indexOf('.') !== -1 && (Ext.ClassManager.isCreated(name) || Ext.Loader.isAClassNameWithAKnownPrefix(name))) {
return name;
} else {
return this.name + '.' + module + '.' + name;
}
}
因此,如果存在具有已知前缀的完全限定类名,它将只返回名称,否则将使用this.name
构建类名,这是应用程序名称,因此使用存储:['Test']
将指向A.store.Test
我正在考虑写一个覆盖,但我担心它会破坏其他东西。没有覆盖,我认为这是不可能的。更重要的是,对于我的观点,它也不应该工作
ext All debug.js中的所有代码
控制器使用其自己的类名使用适当的前缀正确加载类:
namespace = Ext.Loader.getPrefix(className) || match[1];
namespaceAndModule = namespace + '.' + module + '.'
但对于每个视图、存储、模型,其控制器都会创建一个getter,将名称传递给getStore、getView、getModel函数
if (!this[fn]) {
this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
}
getter传入的getStore函数返回应用程序存储:
getStore: function(name) {
return this.application.getStore(name);
},
应用程序本身使用getModuleClassName解析类名
getModuleClassName: function(name, module) {
if (name.indexOf('.') !== -1 && (Ext.ClassManager.isCreated(name) || Ext.Loader.isAClassNameWithAKnownPrefix(name))) {
return name;
} else {
return this.name + '.' + module + '.' + name;
}
}
因此,如果存在具有已知前缀的完全限定类名,它将只返回名称,否则将使用this.name
构建类名,这是应用程序名称,因此使用存储:['Test']
将指向A.store.Test
我正在考虑写一个覆盖,但我担心它会破坏其他东西