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, время: 13:33. |