據我所知,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的人打算在這裏做防禦性編程,不允許用戶干涉核心內部)。如果你設法通過某種方式獲得它,那麼你可以訪問這個'private'屬性並獲得元素列表(實際上是ID和引用之間的映射)。
這裏沒有公共的API。
如果您的頁面具有根視圖,您可以通過爲每個控件聚合應用getter並遍歷所有內容(如此等等)來創建遍歷視圖樹的recuresive函數。
您可以使用控件的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)獲得所有已註冊元素的地圖。