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

时间:2017-06-05 13:34:51

标签: sapui5

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

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

这样的事情:

var aControls = sap.ui.getCore().allControls();

3 个答案:

答案 0 :(得分:2)

≥UI51.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中运行,请继续阅读解决方法..

≤UI51.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;
},

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插件

编写测试时,另一个选项是使用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()方法获取公共聚合名称。

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