就像标题所说,我在最佳实践/良好编码的范围内有一个简单的问题。在我的组件中,我经常需要从视图中访问元素。所以现在我想知道,如果我应该使用sap.ui.getCore().byId(ID)
方法来获取我的元素或this.getView().byId(ID)
运算符。我想也许这不管我选择哪一个,但我想了解更多有关整个sapui5内容的信息,也许有一种方法可以选择一种解决方案。
修改
也许我对我的要求不够清楚,现在纠正错了。我的问题在于组件的范围。所以我想知道我是应该通过this
运算符还是sap.ui.getCore().byId(ID)
访问我的元素。我知道这个操作符是什么等等,但我不知道,哪个变体“更清楚”:
答案 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
控件。