Подстановочные знаки Ext ComponentQuery

Я просмотрел примеры и документы и не смог найти, можно ли использовать подстановочные знаки в запросе ComponentQuery. Я хотел бы сделать следующее:

 Ext.ComponentQuery.query('button > menu > menuitem[text="Welcome*"]');

Поскольку текст кнопки будет текущим именем пользователя, например, «Добро пожаловать, Шон».


person b3verelabs    schedule 24.01.2013    source источник


Ответы (3)


Пытаться

Ext.ComponentQuery.query('menuitem{text.search(\'Элемент меню\' )!=-1}');

В документах вы можете использовать пользовательские выражения. Это работает для кода, который я включил ниже:

var toolbar = Ext.widget('toolbar', {
        items   : [
            {
                xtype:'splitbutton',
                text: 'Menu Button',
                iconCls: 'add16',
                menu: [{text: 'Menu Item 1'},{text: 'Menu Item 2'}],
                reorderable: false
            },
            {
                xtype: 'button',
                text: 'Get matches',
                handler: function(){
                    var match = Ext.ComponentQuery.query('menuitem{text.search( \'Menu Item\' )!=-1}');
                    console.log( match )
                }
            }
        ]
    });

    Ext.widget('panel', {
        renderTo: Ext.getBody(),
        tbar    : toolbar,
        border  : true,
        width   : 600,
        height  : 400
    });
person existdissolve    schedule 24.01.2013
comment
Это не задокументировано, это предположение? docs.sencha.com/ext-js/4 -1/#!/api/Ext.ComponentQuery - person Juan Mendes; 24.01.2013
comment
@JuanMendes Это задокументировано, потому что он использует выражение члена вместе с собственным string.search метод. Пример для выражений-членов не лучший, потому что не дает понять, что вы можете применить функцию-член к селектору, чтобы он работал только на нем. - person sra; 25.01.2013
comment
@JuanMendes Кстати. с The example for Member expressions is not the best... я имею в виду пример API! - person sra; 25.01.2013
comment
@sra existsdissolve изменил свой ответ, раньше он содержал оператор ^= - person Juan Mendes; 25.01.2013

Просто для полноты картины (и потому, что выражения-члены могут привести к сбою запроса)

Как указано в @existdissolve, вы можете архивировать что-то похожее (не то же самое!) с подстановочным знаком с помощью Выражение члена как в вашем случае

Ext.ComponentQuery.query('button > menu > menuitem{text.search("Welcome")!=-1}');

При этом будет предпринята попытка выполнить нативную операцию поиска JS по текстовому свойству любого найденного элемента меню. Независимо от того, существует ли это свойство (или метод), это подводит меня к основной проблеме выражений-членов

Что нужно знать о выражениях участников

Вы можете использовать выражения-члены почти для каждого селектора, но они должны существовать в этом селекторе, иначе вы получите исключение, которое прерывает запрос (полностью, как исключение ).

Вот простой пример. Допустим, вы хотите найти кнопку по ее тексту. Это не должно быть проблемой, все кнопки нуждаются в тексте, не так ли? Это работает довольно долго, пока ваш клиент не пожалуется, что некоторым кнопкам не нужен текст, достаточно простого изображения. Вы забыли о запросе и добавили кнопку, и вдруг части вашего приложения перестают работать, в то время как вы получаете исключение, например

Uncaught TypeError: невозможно вызвать метод 'search' для неопределенного

Вы можете сами попробовать это на примере JSFiddle. Попробуйте «найти меня», а затем нажмите кнопку «Добавить изображение» и повторите попытку.

Почему это происходит? Ext.ComponentQuery не проверяет ни существование свойства, ни существование выражения, что может быстро привести к полной ошибке запроса.

Да, приведенный выше пример прост, и вы можете очень быстро найти источник ошибки, но он также может быть совершенно другим.

Что теперь? Я не хочу сказать, что вы не должны использовать Выражение-член, но вам действительно нужно позаботиться о побочных эффектах, с которыми вы можете столкнуться.

person sra    schedule 25.01.2013
comment
Согласованный. В случае исходного вопроса я бы, вероятно, выбрал уникальное имя для типа используемого элемента меню (независимо от изменчивости текста), а затем просто использовал это имя в более стандартном запросе компонента. - person existdissolve; 25.01.2013
comment
@existdissolve Не поймите меня неправильно. В моем комментарии к вашему ответу я имею в виду API, а не ваш ответ. Думаю, я недостаточно ясно выразился. Ваш ответ абсолютно правильный. Своим дополнением я просто хочу указать на минусы Member Expressions - person sra; 25.01.2013
comment
Спасибо, я хотел не назначать идентификатор своим компонентам и просто использовать сгенерированный идентификатор. Но в этом случае я думаю, что сделаю именно это, а вы простой запрос, как указывает @existdissolve. - person b3verelabs; 25.01.2013
comment
Вместо того, чтобы назначать идентификатор, вы можете просто добавить дополнительный класс ко всем пунктам меню одного типа и использовать его в селекторе. - person existdissolve; 25.01.2013
comment
@theboulderer Или просто любое имя свойства, которое вам нравится. Например, itemId:ButtonABC, который дополнительно поддерживается ExtJS или любым другим, например action:'start'. - person sra; 25.01.2013
comment
Круто, не знал этого. Спасибо! - person b3verelabs; 25.01.2013

Начиная с ExtJS 5 была введена функциональность, которая делает эту задачу намного чище, позволяя выполнять сопоставление с помощью регулярных выражений. документация предоставляет дополнительную информацию, но решение, которое решает опубликованный вопрос, будет выглядеть так:

Ext.ComponentQuery.query('button > menu > menuitem[text/="^Welcome"]');
person Grant Humphries    schedule 10.11.2016