30.09.2018, 23:16
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
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"
Как правильно получить компонент?
|
|
02.10.2018, 09:24
|
Профессор
|
|
Регистрация: 07.08.2013
Сообщений: 214
|
|
1) id повторяется у вас, а оно должно быть уникальным отсюда эксепшен.
2) определять id на уровне класса не нужно (у вас id: 'ActionPanelTree'), этот атрибут подразумевается использовать на уровне экземпляров
|
|
02.10.2018, 13:11
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Т. е при определении класса мы не указываем 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 я новичок и пытаюсь разобраться как правильно работать с компонентами.
|
|
02.10.2018, 20:19
|
Профессор
|
|
Регистрация: 07.08.2013
Сообщений: 214
|
|
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");
|
|
03.10.2018, 09:54
|
Аспирант
|
|
Регистрация: 12.11.2015
Сообщений: 68
|
|
Хорошо, к примеру если во 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 [ ]
|
|
03.10.2018, 14:49
|
Профессор
|
|
Регистрация: 07.08.2013
Сообщений: 214
|
|
Сообщение от Ambassador
|
Хорошо, к примеру если во 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()
|
я же код ваш не вижу кроме этого класса.. как я вам чтото определенное скажу. фидл сделайте короткий на его примере скажу конкретно что не так.
по коду класса BookApp.view.StorageTree могу заметить, что при таком создании стора он будет расшарен между всеми экземплярами этого класса (так как при такой записи созданный стор вешается на прототип класса)..хотя если у вас экземпляр предполагается один тогда пофиг.
Сообщение от Ambassador
|
Если делаю так:
var tree = Ext.create('BookApp.view.StorageTree');
var selection = tree.getSelection();
console.log(selection);
selection пустой массив Array [ ]
|
ну исходя из этих трех строчек он и должен быть пустым.
строка 1: создали вью (у которого есть стор)
строка 2: получили выделенные записи
а где тут код выделяющий записи чтобы этот массив стал не пустым?
|
|
|
|