SAP数据模型{UI}的访问值

时间:2016-02-04 16:18:45

标签: binding model odata sap sapui5

我这几周开始使用SAPUI5并构建了我的第一个显示一些数据的应用程序。我甚至设法做了一些过滤,但现在我遇到了一个我不理解的错误。

我的oData模型具有以下结构:

Notice('0000'):
  Value0: abc
  Value1: def
  Value2: ghi


Notice('0001'):
  Value0: abc
  Value1: def
  Value2: ghi

我有一张包含数据的表格:

<Table
    id="noticeList"
    class="sapUiResponsiveMargin"
    width="auto"
    items="{
        path : '/Notice',
        sorter : {
            path : 'Value0'
        }
    }">

...一些标题内容和列声明......

      <items>
        <ColumnListItem
             id="noticeColumnListItem"
             items="{
                path : '/Notice'
            }">
            <cells>
                <ObjectStatus text="{Value0}"/>
                <ObjectStatus text="{Value1}"/>
                <ObjectStatus text="{Value2}"/>
           </cells>
        </ColumnListItem>
    </items>
</Table>

现在,我想访问模型的数据(无论是在渲染之前还是之后)。我没有触发此事件的事件,我只需要在传输模型数据后立即获取信息。

所以我搜索了一下,发现了以下内容:

var myValue = this.byId("noticeList").getModel().getProperty("/Notice/Value0");

我尝试了所有可能的路径但总是最终确定myValue未定义。当我转储模型时,我可以看到它包含一个具有所需值的对象oData。此外,我的列表是正确的,但我只是无法从模型中读取单个值。

这就是我在Component.js中实现它的方式:

config: {
    fullWidth: true,
    resourceBundle: "i18n/messageBundle.properties",
    serviceConfig: {
        name: "MYJOBS",
        serviceUrl: "/sap/opu/odata/sap/PATH_TO_SERVICE"
    }
},

// Read service URL
var sServiceUrl = mConfig.serviceConfig.serviceUrl;

// Create and set domain model to the component

var oModel = new sap.ui.model.odata.ODataModel(sServiceUrl, {
    json: true,
    loadMetadataAsync: true
});

oModel.attachMetadataFailed(function() {
    sap.ui.getCore().getEventBus().publish("Component", "MetadataFailed");
}, this);

//var oModel = new sap.ui.model.odata.ODataModel(sServiceUrl);
this.setModel(oModel);

也许我还应该提一下,我不使用index.html来加载应用程序,而是通过Fiori Launchpad和Component.js来实现这一点

我花了几个小时来解决这个问题并且找不到解决方案,希望有人可以帮忙...

亲切的问候!

3 个答案:

答案 0 :(得分:2)

如果您正在调用远程服务,则导致未定义方案的最常见原因是在其他代码继续执行时返回数据的延迟(因为您异步调用服务)。

如果您尝试对返回的数据执行操作,则可以通过以下方式附加事件侦听器/ anonyomous函数来执行此操作:

oModel.attachRequestCompleted(function(){
                    // do something
                });

在您的方案中,您的控制器代码可能会更改为如下所示:

 onInit: function() {

   var sServiceUrl = "/sap/opu/odata/sap/yourPathSRV/";
   var oModel = new sap.ui.model.odata.ODataModel(sServiceUrl);
   oModel.attachRequestCompleted(function(){
                    // do something
                });
   this.getView().setModel(oModel);
}

答案 1 :(得分:2)

伯纳德的回答是解决问题!

问题是我试图过早访问数据。 我是alerady试图通过使用自建的睡眠功能来避免这种情况,但是失败了(因为睡眠只是延长了请求时间)。

这就是诀窍:

this.byId("noticeList").getModel().attachRequestCompleted(function(oEvent){

    var model = oEvent.getSource();

    var myNeededValue = model.getProperty("/NoticeSet('0001')/Value0"));

});

非常感谢!

答案 2 :(得分:1)

首先,我希望我能把一切都弄好,而你最后得到我的观点:-)

对于文件夹等的正确元素结构,您应该获得Web IDE的试用版并使用模板&#34; SAPUI5&#34;。不要低估结构:-)

您的应用的结构应该是:
父文件夹
webapp文件夹
现在在同一级别:component.js / index.html和文件夹(例如视图和控制器或i18n)

1)Component.js / manifest.json(在较新版本中> 1.32)
- &GT;它仅包含有关模型实例,i18n实例,服务URL,目标和路由模式的信息。这里没有模型加载!

config: {
    fullWidth : true,
    resourceBundle: "i18n/messageBundle.properties",
    serviceConfig: {
        type: "OData",  // type is missing
        uri: "/sap/opu/odata/sap/PATH_TO_SERVICE" // use uri as property
    }

},

2)控制器(在onInit-hook-method中)

 onInit: function() {

   var sServiceUrl = "/sap/opu/odata/sap/yourPathSRV/";
   var oModel = new sap.ui.model.odata.ODataModel(sServiceUrl);
   this.getView().setModel(oModel);

}

3)查看(内容区域)

<mvc:View controllerName="TEST.controller.Main"
   xmlns:l="sap.ui.layout"
   xmlns:mvc="sap.ui.core.mvc" 
   xmlns="sap.m">
 <App>
  <pages>
   <Page title="{i18n>title}">
    <content>
    <List id="yourListId" items="{/Notice}">
      <StandardListItem description="{Value0}" title="{Value1}"/>
     </List>
    </content>
   </Page>
  </pages>
 </App>
</mvc:View>

4)后端

- &GT;你需要实现GET_ENTITYSET - 方法来读取&#34;多个&#34;通知实体: - )