ExtJs ComponentQuery 組件選擇器

ID選擇器

根據(jù)組件id來(lái)選擇組件稳懒,具有唯一性。前面以”#”號(hào)來(lái)標(biāo)志,返回itemid或者id為“panel”的組件實(shí)例

var panel = Ext.ComponentQuery.query('#panel');

類別選擇器

類選擇器根據(jù)類的xtype來(lái)選擇赋除,可選擇前面是否以”.”來(lái)標(biāo)志,如:根據(jù)xtype返回所有Ext.GridPanel實(shí)例

var cmp= Ext.ComponentQuery.query('gridpanel');

var cmp= Ext.ComponentQuery.query('.gridpanel');

panel#myPanel 可以通過(guò)xtype與id,itemId組件匹配 查找xtype為panel并且id或者itemId為myPanel的所有組件

屬性選擇器

根據(jù)組件的屬性來(lái)選擇,可以選擇具有某個(gè)屬性的組件纫溃,或者屬性為特定值的組件墨林。

var btnOk= Ext.ComponentQuery.query('button[iconCls]'); -返回具有iconCls屬性的Ext.Button的實(shí)例

Ext.ComponentQuery.query('component[autoScroll]')-匹配xtype為component的所有組件,并且autoScroll不等于空,不等于false.

也可以選擇某個(gè)屬性為特定值的組件

var btnOk= Ext.ComponentQuery.query('button[text = "ok"]'); -返回text屬性為“ok”的Ext.Button的實(shí)例

值得注意的是,屬性可以是任何自定義屬性

Ext.create("Ext.Panel", {

myAttribute:"helloWorld"});

Ext.ComponentQuery.query('panel[myAttribute= "helloWorld"]'); -自定義屬性也可以匹配的到

后代選擇器

后代選擇器也稱為包含選擇器赁酝,用來(lái)選擇特定容器或容器組的后代,后代選擇器由兩個(gè)常用選擇器旭等,中間加一個(gè)空格表示酌呆。其中前面的選擇器選擇父組件,后面的選擇器選擇后代組件搔耕。

var panelsWithinmyCt = Ext.ComponentQuery.query('#myCt panel'); --返回所有id為“myCt”的容器中Ext.Panel實(shí)例

E FAll descendant Components of E that match F (官方說(shuō)明-遞歸向下查詢所有可以匹配的組件)

子選擇器

請(qǐng)注意這個(gè)選擇器與后代選擇器的區(qū)別隙袁,子選擇器(child selector)僅是指它的直接后代,而后代選擇器是作用于所有子后代組件弃榨。后代選擇器通過(guò)空格來(lái)進(jìn)行選擇菩收,而子選擇器是通過(guò)“>”進(jìn)行選擇,我們看下面的代碼:

var directChildPanel = Ext.ComponentQuery.query('#myCt > panel'); --返回所有id為“myCt”的容器的子組件中的Ext.Panel實(shí)例

E > FAll direct children Components of E that match F (官方說(shuō)明-查詢直接后代,子孫后代則不匹配)

Ext.create("Ext.Panel", {

itemId:"myCt",

itmes:[{

xtype:"panel",

html :"我是myCt的直接后代",

itmes: [{

xtype:"panel",

html :"我是myCt的子孫后代",

}]

}]

});

向上選擇

E ^ FAll parent Components of E that match F

Ext.ComponentQuery.query('textfield ^ form')查找給定元素 的父容器 (遞歸向上查找所有匹配元素)

Attribute matching operators(屬性匹配運(yùn)算符)

The'='operator will return the results thatexactlymatch the specified object property (attribute):

Ext.ComponentQuery.query('panel[cls=my-cls]'); --精確匹配,匹配xtype為panel的元素,并且cls='my-cls'

會(huì)匹配如下組件:

Ext.create('Ext.window.Window', {

cls:'my-cls'})

但是不會(huì)匹配如下組件:

Ext.create('Ext.panel.Panel', {

cls:'foo-cls my-cls bar-cls'

});

You can use the'~='operator instead, it will return Components with the property thatexactlymatches one of the whitespace-separated values. This is also true for properties that only haveonevalue:

Ext.ComponentQuery.query('panel[cls~=my-cls]'); --匹配xtype為panel 并且cls='my-cls' 或者 cls 包含?'my-cls'的所有組件

會(huì)匹配下列組件

Ext.create('Ext.panel.Panel', {

cls:'foo-cls my-cls bar-cls'});

Ext.create('Ext.window.Window', {

cls:'my-cls'});

Ext.ComponentQuery.query('panel[title^=Sales]');--匹配xtype為panle 并且 title已Sales開頭的組件

Ext.create('Ext.panel.Panel', {

title:'Sales estimate for Q4'});

Ext.ComponentQuery.query('field[fieldLabel$=name]'); ----匹配屬性以給定值結(jié)尾的組件

Ext.create('Ext.form.field.Text', {

fieldLabel:'Enter your name'});

*= 表達(dá)式會(huì)匹配屬性中包含某個(gè)值 無(wú)論出現(xiàn)在什么地方都可以匹配

Ext.ComponentQuery.query('Ext.ComponentQuery.query('panel[fuck*=NameIs])');

varp = Ext.create("Ext.panel.Panel", {

mytest:"myNameIsJack",

width:300,

height:200});

@=表達(dá)式會(huì)匹配組件顯示聲明的屬性,不會(huì)去查詢?cè)玩溨械膶傩?/p>

The following test will find panels with theirownPropertycollapsed being equal tofalse. It will?not?match a collapsed property from the prototype chain

Ext.ComponentQuery.query('panel[@collapsed=false]')

會(huì)匹配如下組件

Ext.create('Ext.panel.Panel', {

collapsed:false});

不會(huì)匹配下面的情況,不會(huì)通過(guò)prototype-china鏈進(jìn)行查找

Ext.create('Ext.panel.Panel', {

});

var disabledFields = myFormPanel.query("{isDisabled()}"); --可以根據(jù)組件的方法進(jìn)行查找,返回所有isDisabled()返回true的組件

有的時(shí)候我們需要自定義的邏輯進(jìn)行匹配,那么我們可以再組件中定義我們自己的方法.如下:

Ext.ComponentQuery.query("{myMatcher('myPanel')}");

但是需要注意必須在所有組件中聲明該方法,不然會(huì)出現(xiàn)異常.所以我們可以overrideExt.Component這個(gè)類,默認(rèn)返回false.然后再子類重寫該方法 如下:

Ext.define('My.Component', {

override:'Ext.Component',

myMatcher:function() {returnfalse; }

});

Ext.define('My.Panel', {

extend:'Ext.panel.Panel',

requires: ['My.Component'],//Ensure that Component override is appliedmyMatcher:function(selector) {returnselector === 'myPanel';

}

});

Conditional matching(條件匹配)

Attribute matchers can be combined to select only Components that matchallconditions (logical AND operator):

匹配同時(shí)滿足多個(gè)條件的匹配表達(dá)式

Ext.ComponentQuery.query('panel[cls~=my-cls][floating=true][title$="sales data"]');

//匹配xtype為panel的 并且同時(shí)滿足[cls~=my-cls][floating=true][title$="sales data"]條件的所有組件

Expressions separated with commas will match any Component that satisfies?either?expression (logical OR operator):

匹配用逗號(hào)分隔的滿足任意一個(gè)條件的組件

Ext.ComponentQuery.query('field[fieldLabel^=User], field[fieldLabel*=password]');

//匹配倆種條件field[fieldLabel^=User], field[fieldLabel*=password] 其中的一種條件,或者的關(guān)系.只要滿足其中一個(gè)就匹配得到

Pseudo classes(偽類選擇器)

:first

// 查詢滿足條件的第一個(gè)元素

Ext.ComponentQuery.query('panel > button:first');

:last

//查詢滿足條件的最后一個(gè)元素

Ext.ComponentQuery.query('form[title=Profile] field:last');

:focusable

//返回可以獲得焦點(diǎn)的組件

panel.down(':focusable').focus();

:not

//給定一個(gè)選擇器,匹配相反的結(jié)果,返回所有field 但是xtype不是hiddenfield的組件

form.query('field:not(hiddenfield)');

紅色部分可以放任何選擇器表達(dá)式 比如 title^=hello

:nth-child 查詢奇數(shù)鲸睛,偶數(shù) 每隔3個(gè)

//Find every odd field in a formform.query('field:nth-child(2n+1)');//or use shortcut: :nth-child(odd)//Find every even field in a formform.query('field:nth-child(2n)');//or use shortcut: :nth-child(even)//Find every 3rd field in a formform.query('field:nth-child(3n)');

自定義選擇器

//定義一個(gè)篩選的方法

//Function receives array and returns a filtered array.Ext.ComponentQuery.pseudos.invalid =function(items) {vari = 0, l = items.length, c, result =[];for(; i < l; i++) {if(!(c =items[i]).isValid()) {

result.push(c);

}

}returnresult;

};

//使用前面構(gòu)造的方法進(jìn)行查詢

var invalidFields = Ext.ComponentQuery.query('field:invalid', myFormPanel);

//還可以給自定義的選擇器穿參數(shù)

//Handler receives array of itmes and selector in parenthesesExt.ComponentQuery.pseudos.titleRegex =function(components, selector) {vari = 0, l = components.length, c, result = [], regex =newRegExp(selector);for(; i < l; i++) {

c=components[i];if(c.title &?ex.test(c.title)) {

result.push(c);

}

}returnresult;

}varsalesTabs = tabPanel.query('panel:titleRegex("sales\\s+for\\s+201[123]")');


在容器中查詢

query方法查詢過(guò)程中娜饵,默認(rèn)會(huì)遍歷所有組件。顯然這個(gè)是十分影響效率的腊凶,把搜索范圍限定起來(lái)划咐,能使查詢速度大大提高拴念。還記得query方法的第二個(gè)參數(shù)嗎?我們這樣做:

var btnRefresh = Ext.ComponentQuery.query('#btnRefresh', container);

另一種方式個(gè)人比較推薦褐缠,因?yàn)樗雌饋?lái)特別地干凈利落:

var btnRefresh = container.query('#btnRefresh');

說(shuō)到這里政鼠,就不能不提提Container類中用于查詢組件的幾個(gè)方法了。

Container中的query方法队魏、down方法公般、child方法和up方法,都是基于組件選擇器而實(shí)現(xiàn)的組件查詢方法胡桨,調(diào)用這些方法官帘,可以很輕松地獲取想要的組件。

區(qū)別列舉如下:

query 后代組件 所有符合條件的組件集合

down 后代組件 第一個(gè)符合條件的組件

child 子組件 第一個(gè)符合條件的組件

up 祖先組件 第一個(gè)符合條件的組件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昧谊,一起剝皮案震驚了整個(gè)濱河市刽虹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呢诬,老刑警劉巖涌哲,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尚镰,居然都是意外死亡阀圾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門狗唉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)初烘,“玉大人,你說(shuō)我怎么就攤上這事分俯∩隹穑” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵澳迫,是天一觀的道長(zhǎng)局齿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)橄登,這世上最難降的妖魔是什么抓歼? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拢锹,結(jié)果婚禮上谣妻,老公的妹妹穿的比我還像新娘。我一直安慰自己卒稳,他們只是感情好蹋半,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著充坑,像睡著了一般减江。 火紅的嫁衣襯著肌膚如雪染突。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天辈灼,我揣著相機(jī)與錄音份企,去河邊找鬼。 笑死巡莹,一個(gè)胖子當(dāng)著我的面吹牛司志,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播降宅,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼骂远,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腰根?” 一聲冷哼從身側(cè)響起激才,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唠雕,沒(méi)想到半個(gè)月后贸营,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岩睁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揣云。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捕儒。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖邓夕,靈堂內(nèi)的尸體忽然破棺而出刘莹,到底是詐尸還是另有隱情,我是刑警寧澤焚刚,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布点弯,位于F島的核電站,受9級(jí)特大地震影響矿咕,放射性物質(zhì)發(fā)生泄漏抢肛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一碳柱、第九天 我趴在偏房一處隱蔽的房頂上張望捡絮。 院中可真熱鬧,春花似錦莲镣、人聲如沸福稳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)的圆。三九已至鼓拧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間越妈,已是汗流浹背毁枯。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叮称,地道東北人种玛。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓤檐,于是被迫代替她去往敵國(guó)和親赂韵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容