Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.09.2018, 23:16
Аспирант
Отправить личное сообщение для Ambassador Посмотреть профиль Найти все сообщения от Ambassador
 
Регистрация: 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"


Как правильно получить компонент?
Ответить с цитированием
  #2 (permalink)  
Старый 02.10.2018, 09:24
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

1) id повторяется у вас, а оно должно быть уникальным отсюда эксепшен.
2) определять id на уровне класса не нужно (у вас id: 'ActionPanelTree'), этот атрибут подразумевается использовать на уровне экземпляров
Ответить с цитированием
  #3 (permalink)  
Старый 02.10.2018, 13:11
Аспирант
Отправить личное сообщение для Ambassador Посмотреть профиль Найти все сообщения от Ambassador
 
Регистрация: 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 я новичок и пытаюсь разобраться как правильно работать с компонентами.
Ответить с цитированием
  #4 (permalink)  
Старый 02.10.2018, 20:19
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 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");
Ответить с цитированием
  #5 (permalink)  
Старый 03.10.2018, 09:54
Аспирант
Отправить личное сообщение для Ambassador Посмотреть профиль Найти все сообщения от Ambassador
 
Регистрация: 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 [ ]
Ответить с цитированием
  #6 (permalink)  
Старый 03.10.2018, 14:49
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 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: получили выделенные записи

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Duplicate class name 'Ext.ux.AppInspector' specified, must be a non- khusamov ExtJS 7 23.05.2015 00:40
Component Focus & Blur khusamov ExtJS 26 22.05.2015 01:52
Разметка для Google closure compiler monolithed Оффтопик 11 04.09.2013 00:50
Плагин PlantUML B~Vladi Оффтопик 49 22.08.2012 16:03
Component Object Model в JavaScript sionus Events/DOM/Window 1 04.02.2010 13:37