Extjs 4 - Пространства имен в плагине, таком как приложение

У меня есть модульное приложение, которое содержит несколько модулей/плагинов, которые также могут работать как отдельные приложения.

Я динамически регистрирую контроллеры module/plugin в основном приложении, и вот проблема в шагах.

  • Мое основное приложение имеет префикс A - его контроллер "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(), чтобы получить сохранить ссылку, которая вызовет много изменений кода.

Как заставить контроллер загружать магазины с правильным префиксом?


person patryks    schedule 11.10.2012    source источник


Ответы (1)


Без переопределения я думаю, что это невозможно. Более того, на мой взгляд, это тоже не должно работать!

Весь код от ext-all-debug.js

Контроллер правильно загружает классы, используя правильный префикс, используя собственное имя класса:

namespace = Ext.Loader.getPrefix(className) || match[1];
namespaceAndModule = namespace + '.' + module + '.'

Но для каждого представления, хранилища, модели его контроллер создает имя передачи геттера в функцию getStore, getView, getModel.

if (!this[fn]) {
    this[fn] = Ext.Function.pass(this['get' + type], [ref], this);
}

Функция 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, которое является именем приложения, поэтому использование stores:['Test'] будет указывать на A.store.Test.

Я думаю о написании переопределения, но боюсь, что это сломает другие вещи.

person patryks    schedule 15.10.2012