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

问题描述 投票:2回答:3

据我所知,OpenUI5有一个实例化控件的注册表,可以用sap.ui.getCore().byId查询。

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

像这样的东西:

var aControls = sap.ui.getCore().allControls();
sapui5
3个回答
4
投票

≥ 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()));

ui5 get registered elements

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


≤ UI5 1.66 (Original answer)

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

有点作弊,是的!

选项1 - 访问真实核心

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)。

UI5 - get registered elements

选项2 - 仅获取控件

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

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

选项3 - Opa插件

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

new OpaPlugin().getAllControls(); // OpaPlugin required from "sap/ui/test/OpaPlugin"

虽然名称表明它将返回Controls,但它实际上也会返回Element实例。

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


1
投票

目前没有记录的获取完整元素列表的方法。元素在核心实例内的mElements私有映射(对象)中注册。您可以在Core source code中查看此对象的用法。它永远不会通过一种方法直接暴露在外面。

通常情况下,您可以简单地绕过“私有”访问级别,这只是JavaScript中的惯例,只是做sap.ui.getCore().mElements,但在这种情况下这不起作用。这是因为核心被包装成Interface(通过一个闭包),它只保存公共方法的代理。这意味着您无法从sap.ui.getCore()调用中获取真正的核心实例,因此您无法从那里访问mElements属性。

我不知道获得“原始”核心实例的任何方式(并且通常不应该这样 - SAP的人员打算在这里进行防御性编程而不允许用户干涉核心内部)。如果您设法通过某种方式获取它,那么您可以访问此“私有”属性并获取元素列表(实际上,ID和引用之间的映射)。


0
投票

这没有公共API。

如果您的页面具有根视图,则可以创建一个递归函数,该函数遍历视图树,方法是为每个控件聚合应用getter并遍历所有内容(等等)。

您可以使用控件的getMetadata()方法获取公共聚合名称。

请注意,通过这种方式,您只能访问公共聚合上的控件,而不能访问内部聚合。

© www.soinside.com 2019 - 2024. All rights reserved.