Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Registering duplicate component id (https://javascript.ru/forum/extjs/75374-registering-duplicate-component-id.html)

Ambassador 30.09.2018 23:16

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"


Как правильно получить компонент?

siber-biber 02.10.2018 09:24

1) id повторяется у вас, а оно должно быть уникальным отсюда эксепшен.
2) определять id на уровне класса не нужно (у вас id: 'ActionPanelTree'), этот атрибут подразумевается использовать на уровне экземпляров

Ambassador 02.10.2018 13:11

Т. е при определении класса мы не указываем 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 я новичок и пытаюсь разобраться как правильно работать с компонентами.

siber-biber 02.10.2018 20:19

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");

Ambassador 03.10.2018 09:54

Хорошо, к примеру если во 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 [ ]

siber-biber 03.10.2018 14:49

Цитата:

Сообщение от Ambassador (Сообщение 495714)
Хорошо, к примеру если во 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 (Сообщение 495714)
Если делаю так:
var tree = Ext.create('BookApp.view.StorageTree');
var selection = tree.getSelection();
console.log(selection);


selection пустой массив Array [ ]

ну исходя из этих трех строчек он и должен быть пустым.
строка 1: создали вью (у которого есть стор)
строка 2: получили выделенные записи

а где тут код выделяющий записи чтобы этот массив стал не пустым?


Часовой пояс GMT +3, время: 15:04.