Sapui5 获取注册表中所有实例化控件的列表

Sapui5 获取注册表中所有实例化控件的列表,sapui5,Sapui5,我知道OpenUI5有一个实例化控件的注册表,可以使用进行查询 但是,有没有办法在控件注册表中获取完整的实例列表 大概是这样的: var aControls = sap.ui.getCore().allControls(); 目前没有文件记录的获取完整元素列表的方法。元素注册在核心实例内的melents私有映射(对象)中。您可以在中检查此对象的用法。它从未通过某种方法直接暴露于外部世界 通常,您可以简单地绕过“私有”访问级别,这只是JavaScript中的一种约定,只需执行sap.ui.get

我知道OpenUI5有一个实例化控件的注册表,可以使用进行查询

但是,有没有办法在控件注册表中获取完整的实例列表

大概是这样的:

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。实际意图是什么?如果你能提出一个有更多细节的新问题,让更多的人能够提供更好的答案,那就太好了。我已经提出了一个问题:,我可以重置输入字段,但我不确定性能的观点。