.this或sap.ui.getCore()。byId()

时间:2016-06-06 08:47:45

标签: this sapui5

就像标题所说,我在最佳实践/良好编码的范围内有一个简单的问题。在我的组件中,我经常需要从视图中访问元素。所以现在我想知道,如果我应该使用sap.ui.getCore().byId(ID)方法来获取我的元素或this.getView().byId(ID)运算符。我想也许这不管我选择哪一个,但我想了解更多有关整个sapui5内容的信息,也许有一种方法可以选择一种解决方案。

修改 也许我对我的要求不够清楚,现在纠正错了。我的问题在于组件的范围。所以我想知道我是应该通过this运算符还是sap.ui.getCore().byId(ID)访问我的元素。我知道这个操作符是什么等等,但我不知道,哪个变体“更清楚”:

2 个答案:

答案 0 :(得分:7)

从当前视图访问元素:

this.getView().byId(...)

从另一个视图访问元素,该视图不是当前视图的一部分(它不是嵌套视图):

sap.ui.getCore().byId(...)

在我看来:如果你必须做后者,你做错了什么。 通常,为了避免id冲突,所有id都应该加上前缀(自动完成,除非这是行为被覆盖)。这样做的缺点是你通常不知道前缀会是什么样子,因此上述声明对你没什么帮助。

备选方案:

  • 可以通过SAPUI5事件总线处理跨控制器通信。然后订户处理视图的更新。视图的修改应始终由视图的控制器处理。所以:控制器C1修改V1 = ok,C2修改V2 ok,C2修改V1 - >坏主意。

  • 使用数据绑定。许多人有时似乎忘记了它不仅可以用于绑定值,而且还可以用于下面。以下示例可以适应许多不同的问题:

// anti-pattern - you will have to do this for all input fields // which becomes very unhandy very quick. this.getView().byId("myInput").setEnabled(false).

这实际上是一种糟糕的做法。更好的方法是拥有一个模型 - 让我们说" pageState"并将元素"启用" -property绑定到此模型。例如。像这样:

<Input enabled="{pageState>/inputFieldsEnabled} ... />

然后在控制器中

this.getModel("pageState").setProperty("/inputFieldsEnabled", false);

答案 1 :(得分:2)

var el = sap.ui.getCore().byId("btn"); 
el = this.getView().byId("btn");

以上两者都可以使用指定的ID返回控件,但是当您尝试使用getCore()访问控件时,它必须在当前窗口中的整个 Core framework 中查找该特定元素,而对于this.getView(),只需要查看当前的视图

因此,从性能的角度来看,使用this.getView()将是不错的选择。

如果您在当前环境中无法通过getCore()访问某些内容,则应使用

this.getView()

例如,访问当前打开的片段中的Input控件。