Расширение классов страницы реестра в мобильном приложении
Есть страница реестра, код которой примерно такой.
Ext.define("MyObjectPage.View", { extend: "Terrasoft.view.BaseGridPage.View", xtype: "myobjectgridpage", config: {//Конфиг } //... }); Ext.define("MyObjectGridPage.Controller", { extend: "Terrasoft.controller.BaseGridPage", //методы и т.д. });
Требуется расширить имеющиеся классы view и controller, не создавая новые. Пробовал добавить следующий код:
Ext.define("MyObjectGridPage.View", { override: "MyObjectGridPage.View", //Остальное... }); Ext.define("MyObjectGridPage.Controller", { override: "MyObjectGridPage.Controller", //Остальное... });
Подключал по разному в манифесте: свойство "Grid" или массив "PagesExtensions" для модели нужного объекта, добавлял в "CustomSchemas". Всё время получаю ошибку:
Uncaught TypeError: Cannot read property 'singleton' of null
По всей видимости, моя схема загружается перед основным классом, что и приводит к ошибке.
Что я мог упустить? Как можно повлиять на порядок загрузки кодов, чтобы выполнился сначала основной код класса, затем мои расширения?
Нравится
Здравствуйте!
- Мы рекомендуем не использовать override для расширения возможностей существующих классов. Для этих целей можно использовать extend.
- Для решения вашей задачи необходимо:
- добавить свои классы, которые будут расширять существующие классы грида (view и контроллер)
- указать эти новые классы в переменной Terrasoft.LastLoadedPageData, использующейся при навигации страниц (по сути, в ней хранится связь view и controller)
- указать в манифесте вашу новую схему с реализацией своих классов в секции Models для соотв. модели в параметре «Grid»
- указать там же в свойстве PagesExtensions ту базовую схему, которую вы расширяли
Возьмем, к примеру, view карточки реестра раздела «Лента». Схема, описывающая view, называется MobileSocialMessageGridPageView и соотв. класс называется SocialMessageGridPage.View.
- Создадим свою схему MySocialMessageGridPage. В нее добавляем след. код:
Terrasoft.LastLoadedPageData = {
controllerName: "SocialMessageGridPage.Controller",
viewXType: "mysocialmessagegridpageview"
};
Ext.define("Terrasoft.configuration.view.MySocialMessageGridPage", {
alternateClassName: "MySocialMessageGridPage.View",
extend: "SocialMessageGridPage.View",
xtype: "mysocialmessagegridpageview",
config: {
myButton: true
},
/**
* @protected
* @virtual
* @cfg-applier
*/
applyMyButton: function(newButton) {
if (!newButton) {
return false;
}
var config = {
style: "background: red; width: 32px; height: 32px;"
};
return Ext.factory(config, "Ext.Button", this.getMyButton());
},
/**
* @protected
* @virtual
* @cfg-updater
*/
updateMyButton: function(newButton, oldButton) {
if (newButton) {
var myButton = this.getMyButton();
this.add(myButton);
}
}
});
В этом расширении класса SocialMessageGridPage.View мы добавили свою красную кнопку, которая будет добавлена в «Ленту». При этом основные моменты в этом классе выделены красным. Т.е. помимо того, что мы расширили существующий класс (extend: "SocialMessageGridPage.View"), мы еще указали свой xtype (xtype: "mysocialmessagegridpageview"). И затем в Terrasoft.LastLoadedPageData указали его, сказав тем самым, что при открытии грида нужно использовать нашу новую view (контроллер при этом будет использоваться базовый, но вы можете его расширить и указать самостоятельно).
- Изменения в манифесте будут следующими:
{
"Models": {
"SocialMessage": {
"Grid": "MySocialMessageGridPage",
"PagesExtensions": [
"MobileSocialMessageGridPage"
]
}
}
}
В итоге результат будет таким (в левом верхнем углу карточки видна красная кнопка):
Вильшанский Дмитрий,
Мне как раз нужно расширить и контроллер. Попробовал сделать аналогично Вашему примеру. Теперь получаю новую ошибку, если добавить код, переопределяющий контроллер.
Uncaught TypeError: Cannot read property 'getName' of undefined at Class.getModelName (ApplicationConfig.js:189) at Class.getModelConfig (ApplicationConfig.js:203) at Class.getConfig (GridPage.sdk.js:24) at Class.beforeInitializeGrid (BaseGridPageController.js:226) at Class.doFire (sencha-touch-all-debug.js:15417) at Class.fire (sencha-touch-all-debug.js:15344) at Class.doDispatchEvent (sencha-touch-all-debug.js:15842) at Class.dispatchEvent (sencha-touch-all-debug.js:15823) at Class.doFireEvent (sencha-touch-all-debug.js:16188) at Class.fireEvent (sencha-touch-all-debug.js:16142) at Class.beforeinitialize (BaseGridPageView.js:75) at Class.doFire (sencha-touch-all-debug.js:15417) at Class.fire (sencha-touch-all-debug.js:15344) at Class.doDispatchEvent (sencha-touch-all-debug.js:15842) at Class.dispatchEvent (sencha-touch-all-debug.js:15823) at Class.doFireEvent (sencha-touch-all-debug.js:16188) at Class.fireEvent (sencha-touch-all-debug.js:16142) at Class.initialize (List.js:566) at Class.constructor (sencha-touch-all-debug.js:22965) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (sencha-touch-all-debug.js:32881) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (Sencha.js:126) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (sencha-touch-all-debug.js:54756) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (sencha-touch-all-debug.js:70258) at new Class (sencha-touch-all-debug.js:5267) at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8) at Object.instantiate (sencha-touch-all-debug.js:7008) at Object.instantiateByAlias (sencha-touch-all-debug.js:6920) at Object.factory (sencha-touch-all-debug.js:10109) at Class.applyGrid (BaseGridPageView.js:80) at Class.setter [as setGrid] (sencha-touch-all-debug.js:5541) at Class.initConfig (sencha-touch-all-debug.js:4979) at Class.constructor (sencha-touch-all-debug.js:22952) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (sencha-touch-all-debug.js:32881) at Class.callParent (sencha-touch-all-debug.js:4715) at Class.constructor (Sencha.js:126) at new Class (sencha-touch-all-debug.js:5267) at eval (eval at getInstantiator (sencha-touch-all-debug.js:7041), <anonymous>:3:8) at Object.instantiate (sencha-touch-all-debug.js:7008) at Object.instantiateByAlias (sencha-touch-all-debug.js:6920) at Object.factory (sencha-touch-all-debug.js:10109) at Class.initializeCacheItem (PageNavigator.js:125) at Class.forward (PageNavigator.js:198) at Class.success (MainPageController.js:318) at Object.callback (sencha-touch-all-debug.js:10397) at Class.loadLookupSubColumnsModels (StructureLoader.js:308) at Class.success (StructureLoader.js:317) at Object.callback (sencha-touch-all-debug.js:10397) at Class.loadLookupSubColumnModels (StructureLoader.js:331) at Class.success (StructureLoader.js:338) at Object.callback (sencha-touch-all-debug.js:10397) at Class.loadSchemas (StructureLoader.js:154) at Class.loadLookupSubColumnModels (StructureLoader.js:335) at Class.success (StructureLoader.js:338) at Object.callback (sencha-touch-all-debug.js:10397) at Class.loadSchemas (StructureLoader.js:154) at Class.loadLookupSubColumnModels (StructureLoader.js:335) at Class.loadLookupSubColumnsModels (StructureLoader.js:313) at Class.success (StructureLoader.js:224) at Object.callback (sencha-touch-all-debug.js:10397) at Class.loadSchemas (StructureLoader.js:154) at Class.loadGridPageModelDependencies (StructureLoader.js:222) at Class.success (StructureLoader.js:196) at Object.callback (sencha-touch-all-debug.js:10397) at Class.success (StructureLoader.js:145) at Object.callback (sencha-touch-all-debug.js:10397) at Class.<anonymous> (ScriptLoader.js:158) at one (head.js:566) at head.js:782 at head.js:818 at HTMLScriptElement.process (head.js:914)
Что я мог упустить?
Бершеда Д. Н.,
Так сказать сложно.
Возьмите эмулятор (http://ftp.bpmonline.com/support/downloads/mobile/7.11.7.rar) и поставьте debugger в функцию getModelConfig: function(model) класса Terrasoft.ApplicationConfig
И посмотрите в переменной model что приходит.