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

Jon*_*ink 3 sapui5

我了解OpenUI5具有实例化控件的注册表,可以通过来查询sap.ui.getCore().byId

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

像这样:

var aControls = sap.ui.getCore().allControls();
Run Code Online (Sandbox Code Playgroud)

Bog*_*ann 5

?UI5 1.67

使用commit:54df6ca,无需其他解决方法。相反,模块Element以及Component提供公共API,例如.all().filter().forEach().size,等等。看到:

样品

sap.ui.require([
  "sap/ui/core/Element"
], Element => console.log(Element.registry.all()));
Run Code Online (Sandbox Code Playgroud)

ui5获取注册元素

如果应用程序在低于1.67的UI5中运行,请继续阅读以获取解决方法。


?UI5 1.66(原始答案)

有没有办法在控制注册表中获取实例的完整列表?

有点作弊,是的!

选项1-访问真正的核心

getRegisteredElements: function() {
  let core;
  const fakePlugin = {
    startPlugin: realCore => core = realCore
  };
  sap.ui.getCore().registerPlugin(fakePlugin);
  sap.ui.getCore().unregisterPlugin(fakePlugin);
  return core.mElements;
},
Run Code Online (Sandbox Code Playgroud)

API registerPlugin等待包含一个方法startPlugin(和stopPlugin)作为参数的对象。只要核心已初始化,它就会立即调用该startPlugin方法。作为一个参数,我们得到了真正的核心,我们可以从中获取所有已注册元素的映射mElements(感谢Serban提示)。

UI5-获取注册元素

选项2-仅获取控件

getRegisteredControls: function() {
  return sap.ui.getCore().byFieldGroupId(""); // pass an empty string!
},
Run Code Online (Sandbox Code Playgroud)

这将返回类型为sap.ui.core.Control (source)的所有已注册元素的数组。空字符串("")确保返回所有控件,无论该控件是否具有字段组ID。

选项3-Opa插件

编写测试时,另一种选择是使用getAllControls来自的专用公共API sap.ui.test.OpaPlugin

new OpaPlugin().getAllControls(); // OpaPlugin required from "sap/ui/test/OpaPlugin"
Run Code Online (Sandbox Code Playgroud)

尽管顾名思义,它将返回Controls,但实际上它也返回Element实例。

该插件提供了其他一些有趣的API太多,如getMatchingControls(有选项来提供controlType?visible?interactable?等..),这可能是有用的。