Data binding SAPUI5:在控制器中检索模型对象

Data binding SAPUI5:在控制器中检索模型对象,data-binding,sapui5,Data Binding,Sapui5,我有一个使用OData服务(在manifest.json中声明)的master-detail应用程序 在细节控制器中,我通过以下方式将模型绑定到视图(此方法附加到路由器对象) 如何从该控制器中访问实际绑定的模型对象 我得到的最接近(但似乎有点太复杂)如下 var path = this.getView().getElementBinding('contracts').sPath.substring(1); var model = this.getView().getModel('contract

我有一个使用OData服务(在manifest.json中声明)的master-detail应用程序

在细节控制器中,我通过以下方式将模型绑定到视图(此方法附加到路由器对象)

如何从该控制器中访问实际绑定的模型对象

我得到的最接近(但似乎有点太复杂)如下

var path = this.getView().getElementBinding('contracts').sPath.substring(1);
var model = this.getView().getModel('contracts').oData[path];
我会想

this.getView().getModel('contracts'))
为您提供模型对象(在类型为
sap.ui.Model.Model
或子类的对象中)

如果您引用的是模型中的数据,则可以使用以下选项:

this.getView().getModel('contracts').getProperty(“/”)

好吧,你的方法并不遥远,实际上与雇佣员工的方法差不多

关键是绑定并不“仅仅”包含绑定的模型对象。它包含有关模型、“绑定对象”的路径和上下文的信息。这些可以从绑定中检索。要访问“绑定对象”,基本上有两条路径可用

从绑定中获取模型和路径,并通过模型访问“绑定对象”:(这是您和hirse概述的内容)

或者获取上下文和路径并通过以下方式访问“绑定对象”:

var context = this.getView().getElementBinding('contracts').oContext;
var boundObject = context.getProperty(context.getPath());

没有做过太多的研究,我更喜欢第二种选择。这似乎更符合上下文绑定的意图。

这产生了与
This.getView().getModel('contracts').oData相同的结果,oData是一个包含每个获取的modelobject(
ContractCompSet('1')、ContractCompSet('2')
等)的对象。但是我更喜欢绑定到视图的单个对象。这个方法何时可用(从按时间顺序排列的pov)?如果我在
bindElement()
之后调用它,
oContext
就是
undefined
。BindingReady上是否存在某种类型的事件?(如果我在绑定模型后立即尝试访问它,我当前的解决方案也不起作用)对此不确定,因为我从未遇到过这个问题。但是,如果您使用服务器端模型,并且对象尚未加载,则会发送一个请求来检索它。由于这可能是一个异步请求,因此可能需要一段时间才能完成。这可能就是数据无法立即获得的原因。您可能需要查看网络活动。此sap.ui.model.Binding的dataReceived事件也可能是一个很好的起点,可以用来查找要挂接到其中的事件。我可能已经找到了更好的方法:在调用
bindElement
时,我为变更事件添加了一个函数(
events:{change:function(){}}
在这里我可以通过
this.getModel().getProperty(this.getPath())访问模型
。但是我不太确定
这个
到底是什么:谢谢你的帮助。'this'是事件的调用源。模型绑定是异步的,所以当你试图检索
oContext
时,你会得到
未定义的
,因为它在那时候可能还不可用。例如,如果你绑定了什么东西对于视图,如下所示:
this.getView().bindElement(sEntityPath);
为了正确检索新上下文,您应该尝试在对ModelContextChanged事件的回调中获取它
this.getView().attachModelContextChange(函数(){/*您的操作*/})
Hi Marc,你发布它已经有一段时间了,但我有一个相同的问题:我想访问Detail Controller中的单个数据,到目前为止我只能使用视图本身中的数据。你解决了上述问题吗?是的,你可以访问控制器中视图的所有数据。我通常这样做
this.getView().getBindingContext(“模型的名称”)
。这将为我提供绑定到视图的上下文。然后,您可以执行
.getObject()
来访问实际数据。给我一个代码示例,我可以尝试提供帮助。
var path = this.getView().getElementBinding('contracts').sPath;
var boundObject = this.getView().getModel('contracts').getProperty(path);
var context = this.getView().getElementBinding('contracts').oContext;
var boundObject = context.getProperty(context.getPath());