Sapui5 v2.ODataModel:哪种API更受欢迎&引用;bindElement";或;读“什么?”;?
我设置Sapui5 v2.ODataModel:哪种API更受欢迎&引用;bindElement";或;读“什么?”;?,sapui5,Sapui5,我设置view.setModel(model),获取视图的模型,并请求model.read(“/entitySet('10000')”)。 然后用/entitySet('10000')/properties填充模型 但是很难将它们分配到视图字段,因为现在在视图中,不起作用。它必须是 另一方面,如果我将视图的上下文绑定设置为“/entitySet('10000')”,则将开始工作 哪一种是首选方法?何时使用.read?如果我想在绑定上下文中直接使用OData调用的结果,我几乎从不使用.read。我
view.setModel(model)
,获取视图的模型,并请求model.read(“/entitySet('10000')”)
。
然后用/entitySet('10000')/properties
填充模型
但是很难将它们分配到视图字段,因为现在在视图中,
不起作用。它必须是
另一方面,如果我将视图的上下文绑定设置为“/entitySet('10000')”
,则
将开始工作
哪一种是首选方法?何时使用
.read
?如果我想在绑定上下文中直接使用OData调用的结果,我几乎从不使用.read
。我唯一一次使用.read
是在对结果进行任何操作之前是否要对其进行操作
请看sdk中的示例,例如:
这种绑定的语法类似于read,但在事件和方法类型上有一些不同,这取决于您想要绑定的内容。例如,绑定到视图使用bindElement
:
this.getView().bindElement(“/entitySet('1000')”;
在此之后,可以通过
访问该特定实体上的字段
下面是我当前的一个应用程序的示例,其中包含事件和一些其他通话参数:
this.getView().bindElement({
路径:`/Orders('${currentOrderNumber}')`,
参数:{
展开:“文本”
},
活动:{
dataRequested:=>this.getView().setBusy(true),
已接收数据:数据=>{
如果(!this.getView().getBindingContext()){
//导航到“未找到”视图
}
},
更改:\\u=>this.getView().setBusy(false)
}
});
对于一个表,它略有不同,因为它取决于您希望绑定的聚合,例如
oTable.bindRows({
路径:“属性”
});
这与:
我几乎同意乔格的观点,但并非完全同意: 这真的取决于你想要实现什么。如果希望从后端显示数据,那么最简单的方法是使用
this.getView().bindElement()
但是,如果您需要在显示之前操作数据(如格式化文本、显示来自base64字符串的图像等),或者您希望使用一些现有数据创建新实体,或者更新现有数据,则使用this.getModel(sName).read()
是一种方法-您可以在successCallback中将read entity及其所有深层实体设置为JSONModel,并从localModel对其进行操作
如果使用localModel,则数据绑定在视图中几乎相同,只是您必须另外指定模型名称以获取数据。例如,如果在Model.read()的successCallback中,您将数据设置为名为“localModel”的模型:
然后在XML视图中指出
<Text text="{localModel>/mainPropertyName}"/>
// for displaying deep entities as List items or in Table
<List items="{localModel>/deepEntityName}">
<StandardListItem title="{localModel>propertyNamefromDeepEntity}" />
</List>
//用于将深度实体显示为列表项或在表中
根据我使用更复杂的只读应用程序的经验,我总是使用Model.Read()。更具表现力总是很重要的。使用专门为完成这一任务而设计的API 比较两种变体:
myModel.read(sPath)
withtext=“{/path/property}”
myControl.bindElement(sPath)
withtext=“{property}”
(route)pattern matched
处理程序中,当用户导航到同一页面时,具有相同路径的.bindElement
不会触发另一个请求,因为模型已经存储了来自上一次调用的实体。它可以立即显示结果。但是,使用
.read
,框架不知道您想要实现什么,因此无论应用程序的状态如何,它都会立即发送请求
此外,第1种变体绝不是未来的证明。它依赖于缓存的结果。这几乎是一个副作用,它的工作在所有。问题是,不能保证这种行为在以后的版本中继续有效。另外,V4 ODataModel中不会有read
方法。
TL;博士
v2.ODataModel#read
- 不从响应创建
上下文。重复
总是发送新请求.read(“”
- 不那么富有表现力。鼓励应用程序开发人员使用客户端模型(例如JSONModel)
- 应用程序失去了上下文感知,增加了TCO,减少了对未来的验证
bindElement或bindObject
- 从响应创建
,并将其存储在内部,以便同一请求可以立即返回数据上下文
- 明确表达意图;应用程序和框架可以与现有的API一起工作
- 更多未来证明:
不支持手动阅读。假设您使用v4。ODataModel
-v2ODataModel.read
方法构建了应用程序,您需要迁移到jsonModel.setData
。玩得开心。:)李>v4
我真的认为,
v2.ODataModel#read
不应该成为一种公共方法。我不鼓励任何人在手动读取$count
值时使用.read
,除了
如果需要格式化实体值,则有现成的格式化程序和绑定类型,它们也很容易扩展
如果应用程序需要重新构造响应
<Text text="{localModel>/mainPropertyName}"/>
// for displaying deep entities as List items or in Table
<List items="{localModel>/deepEntityName}">
<StandardListItem title="{localModel>propertyNamefromDeepEntity}" />
</List>