例とドキュメントを検索しましたが、ComponentQuery クエリでワイルドカードを使用できるかどうかがわかりませんでした。私は次のことをしたい:
Ext.ComponentQuery.query('button > menu > menuitem[text="Welcome*"]');
ボタンのテキストは現在のユーザー名になるため、たとえば「Welcome Shaun」などです。
試す
Ext.ComponentQuery.query('menuitem {text.search(\' Menu Item \')!=-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
});
完全を期すために(メンバー式がクエリをクラッシュさせる可能性があるため)
@existdissolveが述べたように、あなたの場合のようにメンバー式を使用して、ワイルドカードに似た(同じではない!)ものをアーカイブできます
Ext.ComponentQuery.query('button > menu > menuitem{text.search("Welcome")!=-1}');
これは、見つかったメニュー項目のテキスト プロパティに対してネイティブ JS 検索操作を実行しようとします。このプロパティ(またはメソッド)が存在するかどうかに関係なく、メンバー式の主な問題につながります
メンバー式について知っておくべきこと
ほぼすべてのセレクターでメンバー式を使用できますが、それらはそのセレクターに存在する必要があります。そうしないと、クエリを中止する例外が発生します (完全に例外のように)。
簡単な例を次に示します。テキストでボタンを見つけたいとしましょう。問題ありません。すべてのボタンにテキストが必要ですよね。これは、一部のボタンはテキストを必要とせず、単純な画像で十分だと顧客が不満を言うまで、かなりの時間機能します。クエリのことを忘れてボタンを追加すると、突然アプリケーションの一部が機能しなくなり、最終的に次のような例外が発生します
キャッチされていない TypeError: 未定義のメソッド 'search' を呼び出せません
このJSFiddle の例で自分で試すことができます。「私を見つけて」を試してから、「画像の追加」ボタンを押して、もう一度試してください。
なぜこれが起こるのですか?プロパティが存在するかどうか、式が存在するかどうかのExt.ComponentQuery
テストは、クエリの完全な失敗にすぐにつながる可能性があります。
はい、上記の例は単純で、エラーの原因をすぐに見つけることができますが、完全に異なる場合もあります。
今何?メンバー式を使用してはいけないと言いたいわけではありませんが、直面する可能性のある副作用に注意する必要があります。