Sapui5 获取注册表中所有实例化控件的列表
我知道OpenUI5有一个实例化控件的注册表,可以使用进行查询 但是,有没有办法在控件注册表中获取完整的实例列表 大概是这样的:Sapui5 获取注册表中所有实例化控件的列表,sapui5,Sapui5,我知道OpenUI5有一个实例化控件的注册表,可以使用进行查询 但是,有没有办法在控件注册表中获取完整的实例列表 大概是这样的: var aControls = sap.ui.getCore().allControls(); 目前没有文件记录的获取完整元素列表的方法。元素注册在核心实例内的melents私有映射(对象)中。您可以在中检查此对象的用法。它从未通过某种方法直接暴露于外部世界 通常,您可以简单地绕过“私有”访问级别,这只是JavaScript中的一种约定,只需执行sap.ui.get
var aControls = sap.ui.getCore().allControls();
目前没有文件记录的获取完整元素列表的方法。元素注册在核心实例内的
melents
私有映射(对象)中。您可以在中检查此对象的用法。它从未通过某种方法直接暴露于外部世界
通常,您可以简单地绕过“私有”访问级别,这只是JavaScript中的一种约定,只需执行sap.ui.getCore().melents
,但在这种情况下,这将不起作用。这是因为核心被包装到一个(通过闭包)中,该闭包只保存公共方法的代理。这意味着您无法从sap.ui.getCore()
调用中获取真正的核心实例,因此无法从那里访问melents
属性
我不知道如何获得“原始”核心实例(通常情况下,这是不可能的——SAP的员工打算在这里进行防御编程,不允许用户干预核心内部)。如果您想通过某种方式获得它,那么您可以访问这个“私有”属性并获得元素列表(实际上是ID和引用之间的映射)。没有用于此的公共API 如果您的页面有根视图,您可以创建一个递归函数,通过为每个控件聚合应用getter并遍历它们的所有内容(等等),遍历视图树 可以使用控件的
getMetadata()
方法获取公共聚合名称
请注意,通过这种方式,您只能访问公共聚合上的控件,而不能访问内部聚合≥ UI5 1.67
使用,不需要更多的变通方法。相反,模块元素
以及组件
提供公共API,如.all()
,.filter()
,.forEach()
,.size
,等等。见:
-
当前存在的所有
的注册表sap.ui.core.Elements
-
当前存在的所有
组件的注册表
sap.ui.require([
“sap/ui/core/Element”
],Element=>console.log(Element.registry.all());
如果应用程序在低于1.67的UI5中运行,请继续阅读解决方法
≤ UI5 1.66(原始答复) 有没有办法在控件注册表中获取完整的实例列表 有点作弊,是的 选项1-访问真正的核心
getRegisteredElements:function(){
让核心;
常量fakePlugin={
startPlugin:realCore=>core=realCore
};
//“sap/ui/Core/Core”中需要“Core”
注册插件(fakePlugin);
Core.unregisterPlugin(fakePlugin);
返回核心组件;
},
API将等待包含方法startPlugin
(和stopPlugin
)的对象作为参数。只要核心被初始化,它就会立即启动。作为一个参数,我们得到了真正的核心,从中我们可以通过melents
获得所有注册元素的映射(多亏了
选项2-仅获取控件
getRegisteredControls:function(){//“sap/ui/Core/Core”中需要“Core”
返回Core.byFieldGroupId(“|[]);//传递空字符串或空数组!
},
这将返回类型为sap.ui.core.Control
的所有已注册元素的数组。传递”
或[]
可确保返回所有控件,无论该控件是否具有字段组ID
选项3-Opa插件
编写测试时,另一个选项是使用sap.ui.test.OpaPlugin中的专用公共API:
new OpaPlugin().getAllControls();//“sap/ui/test/OpaPlugin”中需要“OpaPlugin”
尽管名称表明它将返回控件,但实际上它也返回元素实例。该插件还提供了一些其他有趣的API,例如(带有提供
controlType?
,可见?
,可交互?
,等等的选项),这些API可能会很有用。感谢关于1.67+的更新,请您为sap.ui.core.Element.registry.filter(回调,thisArg?)提供一些代码片段
?谢谢。@MikeB。下面是一个示例:访问并输入sap.ui.require([“sap/ui/core/Element”],El=>console.log(El.registry.filter(El=>El.isA(“sap.m.Button”)))控制台中的代码>。浏览器将记录类型为sap.m.Button
的所有实例。调用.filter
等函数。作为参数,您只需要传递一个返回布尔值的函数。该函数将为注册表中的每个元素调用。感谢您提供的代码示例。它适用于我,但现在我不仅要获取元素,还要更新它们的值。但它看起来像是filter
返回一个新数组。是否有方法迭代和更新多个sap.m.Input
项的值?谢谢。@MikeB。实际意图是什么?如果你能提出一个有更多细节的新问题,让更多的人能够提供更好的答案,那就太好了。我已经提出了一个问题:,我可以重置输入字段,但我不确定性能的观点。