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)
    with
    text=“{/path/property}”
  • myControl.bindElement(sPath)
    with
    text=“{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>