据我所知,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)获得所有已注册元素的地图。