this.getView().byId()、this.byId() 和 sap.ui.getCore().byId() 之间的区别

Difference Between this.getView().byId(), this.byId(), and sap.ui.getCore().byId()

我用的时候能知道区别和性能吗:

const myControl = this.getView().byId("myIDhere");
const myControl = this.byId("myIDhere");
const myControl = sap.ui.getCore().byId("myIDhere");

当我在 UI5 应用程序中使用 XML 视图时,最好使用三个中的哪一个来执行控件操作?

关于 this.getView().byIdthis.byId(推荐)

看看this.byId方法的source code

// sap.ui.core.mvc.Controller
Controller.prototype.byId = function(sId) {
  return this.oView ? this.oView.byId(sId) : undefined;
};

如您所见,this.byId只是this.getView().byId的一个快捷方式。它们都可以用于 访问视图中定义的控件。 例如:

<!-- Given -->
<Panel id="myPanel" />
myControllerMethod() {
  const thatPanel = this.byId("myPanel"); // === this.getView().byId("myPanel")
},

大约sap.ui.getCore().byId(不要用)

另一方面,API sap.ui.getCore().byId(/*...*/) 等待完全串联的 全局 ID,这就是为什么您 不能 简单地交换 this.byIdsap.ui.getCore().byId 如果目标控件是视图后代。

sap.ui.getCore().byId("__xmlview0--myPanel"); // <strong><-- 避免</strong> 连接 ID 部分!

通常,在开发将添加到 Fiori 启动板 (FLP) 的 UI5 应用程序时,应避免 sap.ui.getCore()。 IE。在控制器中实例化控件时,请记住 使用 API createId:

new Panel("myPanel");

新面板(<strong>this.createId(</strong>"myPanel"<strong>)</strong>); // 使其可以通过 this.byId("myPanel")
访问

来自话题"JavaScript Coding Issues" section "Don't create global IDs":

[...] you must not create stable IDs for your controls, fragments, or views in OpenUI5. Doing so might result in duplicate ID errors that will break your app. Especially when running together with other apps, there could be name clashes or other errors.

Use the createId() function of a view or controller instead. This is done automatically in XMLViews and JSONViews. The createId() function adds the View ID as a prefix, thus recursively ensuring uniqueness of the ID.

关于 ID 的更多信息