OpenUI5にはインスタンス化されたコントロールのレジストリがあり、sap.ui.getCore().byId
でクエリできます。レジストリ内のすべてのインスタンス化されたコントロールのリストを取得
しかし、コントロールレジストリにインスタンスの完全なリストを取得する方法はありますか?このような
何か:
var aControls = sap.ui.getCore().allControls();
OpenUI5にはインスタンス化されたコントロールのレジストリがあり、sap.ui.getCore().byId
でクエリできます。レジストリ内のすべてのインスタンス化されたコントロールのリストを取得
しかし、コントロールレジストリにインスタンスの完全なリストを取得する方法はありますか?このような
何か:
var aControls = sap.ui.getCore().allControls();
要素の完全なリストを取得するのない現在の文書化方法はありません。要素は、コアインスタンス内のmElements
プライベートマップ(オブジェクト)に登録されます。 Core source codeの内部でこのオブジェクトの用途を確認することができます。それは決して方法によって直接外界にさらされることはありません。
通常、JavaScriptの慣例である「プライベート」アクセスレベルを回避するだけで、sap.ui.getCore().mElements
を実行できますが、この場合は機能しません。これは、コアが公開メソッドに対してプロキシのみを保持するInterface(クロージャを使用して)にラップされているためです。つまり、sap.ui.getCore()
コールから実際のコアインスタンスを取得する方法がないため、そこからmElements
プロパティにアクセスすることはできません。
「生の」コアインスタンスを取得する方法はわかりません(通常、ここで防御プログラミングを行い、ユーザーにコア内部を邪魔することを意図していないSAPのユーザー)。それを何らかの方法で取得することができれば、この「プライベート」プロパティにアクセスして要素リスト(実際にはIDと参照の間のマップ)を取得できます。
このための公開APIはありません。
ページにルートビューがある場合は、コントロール集約ごとにゲッターを適用し、それらのすべてのコンテンツ(およびその他)を渡すことによって、ビューツリーを横断する再帰関数を作成できます。
公開集計名を取得するには、コントロールのgetMetadata()
メソッドを使用できます。
このようにして、パブリック集計のコントロールにのみアクセスでき、内部のコントロールにはアクセスできないことに注意してください。
コントロールレジストリにインスタンスの完全なリストを取得する方法はありますか?
ちょっとした不正行為で、はい!
getAllRegisteredElements:() => {
let core;
const fakePlugin = {
startPlugin: realCore => core = realCore
};
sap.ui.getCore().registerPlugin(fakePlugin);
sap.ui.getCore().unregisterPlugin(fakePlugin);
return core.mElements;
},
API registerPlugin
引数としてメソッドstartPlugin
(及びstopPlugin
)を含むオブジェクトを待ちます。コアが初期化されている間はすぐにinvokes the startPlugin
methodになります。パラメータとして、mElements
(hint from Serbanのおかげで)によってすべての登録された要素の地図を得ることができます。