1

我有一个包含多个模块/插件的模块化应用程序,它们也可以作为独立应用程序运行。

我将控制器动态注册module/plugin到主应用程序,这是步骤中的问题。

  • 我的主应用程序有一个前缀 - 它的控制器“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加载B.view.portal.MapPanel但未加载存储。

如果我指定stores:['Test']它尝试加载A.store.Test,如果我指定test.Test它什么都不做(如错误但 ext-all-debug 没有捕获它),如果我指定stores:['B.store.Test']它正确加载它但现在我必须使用getBStoreTestStore()来获取将导致的商店引用很多代码更改。

如何使控制器加载具有适当前缀的商店?

4

1 回答 1

1

如果没有覆盖,我认为这是不可能的。更重要的是我的观点它也不应该起作用!

所有代码来自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应用程序名称构建类名,因此 usingstores:['Test']将指向A.store.Test.

我正在考虑写一个覆盖,但我担心它会破坏其他东西。

于 2012-10-15T11:40:07.800 回答