Есть страница реестра, код которой примерно такой.
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 что приходит.