up() и down() по сравнению с Ext.getCmp()

Я очень запутался, какой из них мне нужно использовать для объекта grep между up() down() и Ext.getCmp(ID).

Для меня проще определить идентификатор для объекта и получить объект с помощью Ext.getCmp('ID'), и код выглядит более чистым.

Например:

console.log(this.up('panel').up('panel').down('grid'));
console.log(Ext.getCmp('myPanel'));

какой из них лучше для производительности?


person Expert wanna be    schedule 08.08.2012    source источник
comment
getCmp, вероятно, лучше для производительности. вы должны использовать UUID, если вы собираетесь использовать getCmp. Производительность — это еще не все.   -  person Neil McGuigan    schedule 09.08.2012


Ответы (2)


Существуют серьезные проблемы с использованием идентификаторов и getCmp для поиска ваших компонентов. Основная проблема заключается в том, что вы не можете безопасно повторно использовать компонент, потому что в большинстве случаев разметка будет создавать элементы HTML с повторяющимися идентификаторами, что является недопустимым HTML. Кроме того, если у вас есть два компонента с одинаковым идентификатором, вы столкнетесь с непредвиденным поведением, которое будет трудно отследить, поскольку платформа не получит правильную ссылку на ваши компоненты.

Об этом есть несколько сообщений в блогах и форумах, а также видео Дж. Гарсии, посвященное этой теме. Предлагаемый способ использования getCmp предназначен только для отладки, переключения на другие методы (вверх, вниз, ссылки, itemId и ComponentQuery) для готового кода.

person dbrin    schedule 08.08.2012
comment
Могу я дать противоположное мнение: я думаю, что слова «повторное использование компонента» и «два компонента с одинаковыми идентификаторами» рядом с «id» странны — много раз кричали, что идентификатор должен быть уникальным. Я один из тех, кто заботится о том, как выглядит DOM, поэтому существует множество идентификаторов и ItemId, чтобы не получать автоматически сгенерированные идентификаторы, которые дает ExtJS. Я просто думаю, что тот факт, что кто-то использует ExtJS, не должен означать DOM в стиле гориллы. - person Izhaki; 09.08.2012
comment
Несмотря на это, учитывая, что это принятый ответ и в интересах других, я думаю, что заголовок вопроса должен измениться на что-то вроде «Должен ли я или не должен использовать идентификаторы с ExtJS». У меня сложилось впечатление, что производительность была ключевым вопросом. - person Izhaki; 09.08.2012
comment
Ижаки, я согласен с вашим "судебным" использованием удостоверений личности там, где это уместно. Я сам использую их для основного макета компонентов области просмотра. Но посмотрите на вопрос — слишком много людей не понимают последствий использования идентификаторов компонентов и их влияния на DOM и поведение приложения. - person dbrin; 09.08.2012
comment
Неплохо! И gz до 6К ;-) - person sra; 30.01.2013

Ext.getCmp() использует внутреннюю хеш-карту, поэтому он работает быстро, почти так же быстро, как извлечение значения в массиве на основе ключа.

.up() и down() реализованы с использованием обхода иерархии компонентов, что является более медленным процессом.

Но up() и down() используют селекторы, поэтому они также могут выбирать классы, а не только идентификаторы.

Вам просто нужно помнить о различных ситуациях, когда вы можете захотеть использовать up() или down(), например, когда есть общий обработчик для множества элементов управления или когда компонент, который вам нужен, был автоматически сгенерирован фреймворком, поэтому вы не можете дать это идентификатор себя.

person Izhaki    schedule 08.08.2012
comment
Я слышал, что использовать getCmp не очень хорошая практика, потому что, если вам нужен доступ к объекту, вы сможете легко получить его в контроллере. Я понимаю, что бывают ситуации, когда это просто не работает, но я просто говорю то, что слышал. - person incutonez; 09.08.2012
comment
Ну, по общему признанию, когда используется структура MVC, вы, вероятно, увидите меньше Ext.getCmp() и больше использования refs и соответствующих им геттеров. Но я бы сказал, что это скорее стильный бизнес, чем что-либо еще. Еще одним преимуществом использования ссылок является то, что если вы измените идентификатор компонента, вам нужно будет обновить его только в ссылках, где с getCmp() вам нужно будет выполнить поиск-замену в базе кода. - person Izhaki; 09.08.2012
comment
Да, это еще одна причина, по которой я слышал, что лучше использовать структуру MVC. Я имею в виду, что имеет смысл использовать его, если вы можете, но, как я уже сказал, иногда вам нужно использовать getCmp. - person incutonez; 09.08.2012
comment
Итак, вы говорите, что Ext.getCmp быстро загорается в Ext JS 4, тогда как в 3 мне следует избегать этого? sencha.com/forum/ - person Christiaan Westerbeek; 04.02.2013
comment
Нет. Если вы посмотрите на источник из Ext.getCmp в 3.4, вы также увидите, что это очень быстро. - person Izhaki; 04.02.2013