【问题标题】:SAPUI5 Data Binding on SimpleFormSimpleForm 上的 SAPUI5 数据绑定
【发布时间】:2016-08-21 05:09:14
【问题描述】:

我在尝试在简单表单上绑定数据时遇到问题。我正在使用模拟服务器并已成功将数据绑定到列表/表格

我的 manifest.json 看起来像这样

"mock": {
    "dataSource": "mainService"
}

我的 mockdata(UserDetailsS​​et.json) 看起来像这样

[{
    "ID_PassNum": "cu001",
    "Title": "Mr",
    "Name": "Don",
    "Surname": "Ownery",
    "ResType": "SA",
    "Country": "South Africa"
}]

我的 SimpleForm 字段如下所示

<Label text="Name" />
<Input value="{mock>/UserDetailsSet/0/Name}" />
<Label text="Surname" />
<Input value="{mock>/UserDetailsSet/0/Surname}"/>

我错过了什么?

【问题讨论】:

    标签: data-binding odata sapui5 sap-fiori


    【解决方案1】:

    您似乎在使用ODataModel。在 ODataModels 中,针对集合/聚合的绑定并不像使用 JSONModel 那样容易。您无法使用 collection/index/property 语法访问/绑定属性。

    ODataModels 如何存储数据

    如果您加载像 UserDetailSet 这样的实体集,则存储在 ODataModel 中的数据看起来有点像这样:

    {
      UserDetailSet('00001'): { ... },
      UserDetailSet('00002'): { ... },
      UserDetailSet('00003'): { ... },
      UserDetailSet('00004'): { ... }
    }
    

    而 '00001' 等是实体键。如果您在 UserDetailSet 上创建聚合绑定,ODataListBinding 将处理将上述数据转换为每个项目的上下文。

    ODataModel 上的属性绑定

    您的绑定必须如下所示:

    <Label text="Name" />
    <Input value="{mock>/UserDetailSet('00001')/Name}" />
    <Label text="Surname" />
    <Input value="{mock>/UserDetailSet('00001')/Surname}"/>
    

    ODataModel 上的动态属性绑定

    或者-更动态一点-像这样绑定(注意:绑定现在是相对的,没有前导/):

    <SimpleForm id="MyForm">
      <Label text="Name" />
      <Input value="{mock>Name}" />
      <Label text="Surname" />
      <Input value="{mock>Surname}"/>
    </SimpleForm>
    

    并在 SimpleForm 本身上动态使用bindElement

    this.getView().byId("MyForm").bindElement({
      path: "/UserDetailSet('"+ sUserID +"')",
      model: "MyOdataModelID",
      // use OData parameters here if needed
      parameters: {
        "expand": "UserAdress"
      },
      // react on binding events here
      events: {
        change: function (oEv) { },
        dataRequested: function (oEv) { },
        dataReceived: function (oEv) {}
      }
    });
    

    BR 克里斯

    【讨论】:

    • 您好,感谢您的帮助。仍然无法正常工作,但感谢您的教育性回应。问候
    • 嗨,除了初始帖子中的内容,我还有以下清单“dataSources”:{“mainService”:{“uri”:“/here/goes/your/serviceUrl/”,“type”: "OData", "settings": { "annotations": [], "odataVersion": "2.0", "localUri": "localService/metadata.xml" 我的表单字段下方的列表实际上是根据模拟服务器。我的视图控制器的 init 事件中没有代码。我试过你的代码 this.getView().byId("MyForm").bindElement({ path: "/UserDetailSet('00001')", model: "mock" }) 问候
    • 你想要的 UserDetail 实体的键真的是'00001'吗?这只是我做的一个例子。如果您的键是整数类型,这将是“/UserDetailSet(1)”或多属性键,例如"/UserDetailSet(ShopID='NY',UserID=1)"
    • 感谢您和我一起旅行。
    【解决方案2】:

    绑定应该是这样的

    <Label text="Name" />
    <Input value="{mock>Name}" />
    <Label text="Surname" />
    <Input value="{mock>Surname}"/>
    

    如果它在模拟中只有一个对象。如果不起作用,请将控制器代码放在您将模型设置为视图的位置

    【讨论】:

    • 您好,感谢您的帮助。尝试了您的绑定建议,但没有奏效。 “将控制器代码放在将模型设置为视图的位置”到底是什么意思。这是你的意思还是怎么做?: onInit: function { // View Controller this.getView.setModel('mock'); ....谢谢
    • 好的,然后模拟模型有列表..然后更改为模拟>/0/name
    • 谢谢。已经尝试过了,它没有工作。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多