据我所知,OpenUI5有一个实例化控件的注册表,可以使用sap.ui.getCore().byId
进行查询。
但是,有没有办法在控制注册表中获取完整的实例列表?
这样的事情:
var aControls = sap.ui.getCore().allControls();
答案 0 :(得分:2)
使用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。
编写测试时,另一个选项是使用sap.ui.test.OpaPlugin
中的专用公共API getAllControls
:
new OpaPlugin().getAllControls(); // OpaPlugin required from "sap/ui/test/OpaPlugin"
虽然名称表明它会返回 Controls ,但它实际上也会返回Element实例。
该插件也提供了一些其他有趣的API,例如getMatchingControls
(包含提供controlType?
,visible?
,interactable?
的选项等等。)这些API可能很有用
答案 1 :(得分:1)
目前没有记录的方法来获取完整的元素列表。元素在核心实例内的--tag-specifications
私有映射(对象)中注册。您可以在Core source code中查看此对象的用法。它永远不会通过一种方法直接暴露在外面。
通常情况下,您可以简单地绕过“私有”访问级别,这只是JavaScript中的约定而只是执行mElements
,但在这种情况下这不起作用。这是因为核心被包装到Interface(通过一个闭包),它只保存公共方法的代理。这意味着您无法从sap.ui.getCore().mElements
调用中获取真实的核心实例,因此您无法从那里访问sap.ui.getCore()
属性。
我不知道获取'原始'核心实例的任何方式(通常它不应该是可能的 - SAP的人打算在这里做防御性编程而不允许用户干涉核心内部)。如果您设法通过某种方式获取它,那么您可以访问此“私有”属性并获取元素列表(实际上,ID和引用之间的映射)。
答案 2 :(得分:0)
此处没有公开API。
如果您的页面有一个根视图,您可以通过为每个控件聚合应用getter并遍历所有内容(等等)来创建一个遍历视图树的recureive函数。
您可以使用控件的getMetadata()
方法获取公共聚合名称。
请注意,通过这种方式,您只能访问公共聚合上的控件,而不能访问内部聚合。