据我所知,OpenUI5有一个实例化控件的注册表,可以用sap.ui.getCore().byId
查询。
但是,有没有办法在控制注册表中获取完整的实例列表?
像这样的东西:
var aControls = sap.ui.getCore().allControls();
使用commit:54df6ca
,不再需要解决方法。相反,模块Element
以及Component
提供公共API,如.all()
,.filter()
,.forEach()
,.size
等。看到:
sap.ui.core.Element.registry.*
目前存在的所有sap.ui.core.Elements
的登记处。sap.ui.core.Component.registry.*
目前存在的所有Components
的登记处。sap.ui.require([
"sap/ui/core/Element"
], Element => console.log(Element.registry.all()));
如果应用程序在低于1.67的UI5中运行,请继续阅读解决方法。
有没有办法在控制注册表中获取完整的实例列表?
有点作弊,是的!
getRegisteredElements: function() {
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)。
getRegisteredControls: function() {
return sap.ui.getCore().byFieldGroupId(""); // pass an empty string!
},
这将返回所有已注册元素的数组,这些元素的类型为sap.ui.core.Control
(source)。无论控件是否具有字段组ID,空字符串(""
)都可确保返回所有控件。
编写测试时,另一种选择是使用getAllControls
的专用公共API sap.ui.test.OpaPlugin
:
new OpaPlugin().getAllControls(); // OpaPlugin required from "sap/ui/test/OpaPlugin"
虽然名称表明它将返回Controls,但它实际上也会返回Element实例。
该插件也提供了一些其他有趣的API,例如getMatchingControls
(提供controlType?
,visible?
,interactable?
等的选项),这可能是有用的。
目前没有记录的获取完整元素列表的方法。元素在核心实例内的mElements
私有映射(对象)中注册。您可以在Core source code中查看此对象的用法。它永远不会通过一种方法直接暴露在外面。
通常情况下,您可以简单地绕过“私有”访问级别,这只是JavaScript中的惯例,只是做sap.ui.getCore().mElements
,但在这种情况下这不起作用。这是因为核心被包装成Interface(通过一个闭包),它只保存公共方法的代理。这意味着您无法从sap.ui.getCore()
调用中获取真正的核心实例,因此您无法从那里访问mElements
属性。
我不知道获得“原始”核心实例的任何方式(并且通常不应该这样 - SAP的人员打算在这里进行防御性编程而不允许用户干涉核心内部)。如果您设法通过某种方式获取它,那么您可以访问此“私有”属性并获取元素列表(实际上,ID和引用之间的映射)。
这没有公共API。
如果您的页面具有根视图,则可以创建一个递归函数,该函数遍历视图树,方法是为每个控件聚合应用getter并遍历所有内容(等等)。
您可以使用控件的getMetadata()
方法获取公共聚合名称。
请注意,通过这种方式,您只能访问公共聚合上的控件,而不能访问内部聚合。