Registering duplicate component id
Друзья, подскажите, из за чего может быть проблема.
Пытаюсь получить компонент след. образом, переопределяя его id: wid = Ext.widget('actionpaneltree', {id: "mytreepanid"}); Сам компонент выглядит так: Ext.define('BookApp.view.ActionPanelTree' ,{ extend: 'Ext.panel.Panel', alias: 'widget.actionpaneltree', id: 'ActionPanelTree', xtype: 'storagepaneltype', region: 'center', tbar: [{ .... В итоге получаю ошибку: Ext.ComponentManager.register(): Registering duplicate component id "mytreepanid" Как правильно получить компонент? |
1) id повторяется у вас, а оно должно быть уникальным отсюда эксепшен.
2) определять id на уровне класса не нужно (у вас id: 'ActionPanelTree'), этот атрибут подразумевается использовать на уровне экземпляров |
Т. е при определении класса мы не указываем id:
Ext.define('BookApp.view.ActionPanelTree' ,{ extend: 'Ext.panel.Panel', alias: 'widget.actionpaneltree', xtype: 'storagepaneltype', itemId: 'actionpanel', region: 'center', tbar: [{ .... После того как нам требуется получить компонент, мы на уровне экземпляров определяем id так: Ext.define('BookApp.view.ActionPanelTree',{id: 'ActionPanelTree'}) И тогда уже можем получать его так: var treepanel = Ext.getCmp('ActionPanelTree'); или так: var treepanel = Ext.ComponentQuery.query('actionpanel');//указываю itemId Правильно ли я это понимаю? p.s Прошу не судить меня строго, в extjs я новичок и пытаюсь разобраться как правильно работать с компонентами. |
id как и itemId это атрибуты используемые уже на объектах (экземплярах классов), на классах они не определяются.
скажу сразу что id (значение должно быть уникальным в рамках всего кода) использовать не рекомендуется. предлагается взамен использовать itemId (значение должно быть уникальным в пределах контейнера). то есть есть у вас класс свой ..кнопки например Ext.define("MyApp.Button", { extend : "Ext.button.Button", alias : "widget.mybutton" }) и когда вы создаете экземпляры класса вы даете им itemId var toolbar = Ext.create("Ext.toolbar.Toolbar", { renderTo: document.body, width : 500, items: [ { xtype : "mybutton", itemId : "save-btn", text : "Save" }, { xtype : "mybutton", itemId : "rollback-btn", text : "Rollback" } ] }) для того чтоб к ним можно было обращаться toolbar.getComponent("save-btn"); toolbar.getComponent("rollback-btn"); |
Хорошо, к примеру если во view у меня компонент дерева:
Ext.define('BookApp.view.StorageTree', { extend: 'Ext.tree.Panel', alias: 'widget.storagetree', xtype: 'storagetreetype', //itemId: 'StorageTree', //id: 'storagetree', //store: 'StorageStore', store: Ext.create('Ext.data.TreeStore', { root: { expanded: true, children: [{ text: 'detention', leaf: true }, { text: 'homework', expanded: true, children: [{ text: 'book report', leaf: true }, { text: 'algebra', leaf: true }] }, { text: 'buy lottery tickets', leaf: true }] } }), rootVisible: false, }); в Controller как мне правильно получить этот компонент что бы применить его методы: getRootNode().appendChild({...}) и getSelection() Если делаю так: var tree = Ext.create('BookApp.view.StorageTree'); var selection = tree.getSelection(); console.log(selection); selection пустой массив Array [ ] |
Цитата:
по коду класса BookApp.view.StorageTree могу заметить, что при таком создании стора он будет расшарен между всеми экземплярами этого класса (так как при такой записи созданный стор вешается на прототип класса)..хотя если у вас экземпляр предполагается один тогда пофиг. Цитата:
строка 1: создали вью (у которого есть стор) строка 2: получили выделенные записи а где тут код выделяющий записи чтобы этот массив стал не пустым? |
Часовой пояс GMT +3, время: 00:04. |