我可以知道使用时的差异和性能:
const myControl = this.getView().byId("myIDhere");
const myControl = this.byId("myIDhere");
const myControl = sap.ui.getCore().byId("myIDhere");
当我在UI5应用中使用XML视图时,最好使用三个中的哪个?
this.getView().byId
和 this.byId
之间的差异根据this.byId
的源代码:
Controller.prototype.byId = function(sId) { return this.oView ? this.oView.byId(sId) : undefined; };
... this.byId
只是this.getView().byId
的快捷方式。它们都可以使用来访问视图中定义的控件。例如:
<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m">
<!-- ... -->
<Panel id="myPanel" />
<!-- ... -->
</mvc:View>
myControllerMethod: function (/*...*/) {
const thatPanel = this.byId("myPanel"); // === this.getView().byId("myPanel")
},
应用程序开发中的sap.ui.getCore().byId
呢?
API sap.ui.getCore().byId
等待完全串联全局ID 在UI5元素注册表中注册的全局ID ,这就是为什么如果目标控制定义为视图的一部分,则不能简单地将this.byId
与CC_8交换。/p>
sap.ui.getCore().byId("someComponent---myView--myPanel"); // <-- Don't!
通常, sap.ui.getCore().byId
应避免开发将添加到应用程序容器的UI5应用程序时,例如SAP Fiori LaunchPad(FLP(。
避免sap.ui.getCore().byId
意味着,在JavaScript中实例化新的UI5元素时,API createId("newPanel")
应与"newPanel"
一起用作本地ID而不是全局:
new Panel({
// Given this === Controller or View instance
id: this.createId("newPanel") // makes it accessible via this.byId("newPanel")
});
从主题" JavaScript编码问题"中。部分"不要创建全局ID" :
[...]您必须不是在OpenUI5中为您的控件,片段或视图创建稳定的ID。这样做可能会导致重复的ID错误,从而破坏您的应用程序。特别是在与其他应用程序一起运行时,可能会有名称冲突或其他错误。
使用
createId()
视图或控制器的功能。这是在XMLViews [...]中自动完成的。createId()
功能将视图ID添加为前缀,从而递归确保ID的唯一性。
如果您确实必须使用sap.ui.getCore().byId
,则自UI5 1.119 >, deprected,需要sap/ui/core/Element
并调用Element.getElementById
(自1.119(或Element.registry.get
(自1.67起(。我想到的一个有效的用例是访问当前聚焦的控件时,通过getCurrentFocusedControlId()
检索ID,直到UI5版本低于1.119。由于1.119,可以通过Element.getActiveElement()
访问当前的集中控制。
在所有其他情况下,应用程序开发通常都有更好的方法。例如,您可能想收听routePatternMatched
或patternMatched
,然后通过oEvent.getParameter("view").byId
访问该元素,而不是尝试通过全局元素注册表访问同一元素。
有关IDS的更多信息
- 文档主题:稳定ID:您需要知道
- q&amp; a:如何通过ID访问XML片段的元素
偏爱模型优先的方法,而不是byId
而不是通过byId
直接访问控件,而是考虑通过数据绑定来操纵UI。模型的更改将自动反映在UI中,如果启用了双向绑定,则UI的用户输入将直接存储在模型中。
SAP Fiori Elements指南
开发Fiori元素扩展时,请确保遵守已记录的兼容性指南,尤其是关于byId
:
[...] 不访问或操纵SAP Fiori元素的内部编码。
中定义的任何UI元素
[...] 不得访问>不在您的 view Extensions 。。⚠小心
如果您不遵守此指南,则您的应用程序可能无法与未来的SAPUI5版本一起使用,因为SAP Fiori元素可能会为具有不同API的新的控件交换控件。