点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
嗨,
我对SAPUI5并不陌生,应该开发一个使用OData服务并在表中显示数据的应用程序。 此外,我还需要能够对OData进行更新。
我对SAPUI5并不了解-基本上我只是被要求使用SAPUI5,然后我就一个人了。 因此,我尝试在 www.sapui5.hana.ondemand.com/上做一些教程。 并遵循"尝试和错误"的方法。
现在,我能够从OData服务(组织为我提供的服务)中检索数据,并在第二个视图的SmartTable中显示它们。 用户选择实体集,依此类推,他希望显示该实体集,然后视图变为智能表。 这在您第一次尝试时有效。 但是,如果您导航回到上一个视图以更改设置并重试,则该表不会刷新。 我觉得我已经尝试了一切,但似乎无法使它正常工作。 如果我能做到这一点,我觉得我将能够实现比在代码中看到的更好的更新odata的方法。
第一个视图:
home.view.xml
此视图的代码:
home.controller.js
sap.ui.define([ " DemoApplication/controller/BaseController", " sap/m/MessageToast" ],函数(BaseController,MessageToast){ "使用严格"; return BaseController.extend(" DemoApplication.controller.Home",{ onInit:function(){ //获取字段 this.apiURLComboBox = this.getView()。byId(" selectedAPI"); this.instanceInputField = this.getView()。byId(" selectedInstance"); this.usernameInputField = this.getView()。byId(" selectedUsername"); this.passwordInputField = this.getView()。byId(" selectedPassword"); this.tableComboBox = this.getView()。byId(" selectedTable"); this.selectedParameters = this.getView()。byId(" selectedParameters"); this.requestTableButton = this.getView()。byId(" requestTableButton"); //初始化变量 this.oDataModel; this.JSONModel =新的sap.ui.model.json.JSONModel(); this.JSON = {}; this.entitySets; this.entityProperties; this.visibleEntityFields; this.invisibleEntityFields; }, //按下刷新按钮时的事件处理程序 refreshTables:function(oEvent){ //销毁表格组合框内的项目 this.tableComboBox.destroyItems(); 尝试{ //使用选定的API URL和输入的实例,用户名和密码检索oDATA this.oDataModel = new sap.ui.model.odata.ODataModel(this.apiURLComboBox.getSelectedKey(),是的,this.usernameInputField.getValue()+ " @" + this.instanceInputField.getValue(), this.passwordInputField.getValue()); //获取实体集 this.entitySets = this.oDataModel.getMetaModel()。getODataEntityContainer(false).entitySet; //用于将实体名称添加到表ComboBox中的循环 for(var i = 0; i未使用atm。 onNavToPerPersonal:function(oEvent){ this.getRouter()。navTo(" perPersonal"); }, //导航到表格视图 onNavToTableView:function(oEvent){ //使用选定的值填充JSON变量 this.JSON.apiURL = this.apiURLComboBox.getSelectedKey(); this.JSON.instance = this.instanceInputField.getValue(); this.JSON.username = this.usernameInputField.getValue(); this.JSON.password = this.passwordInputField.getValue(); this.JSON.table = this.tableComboBox.getSelectedKey(); this.JSON.chosenEntityFields = this.selectedParameters.getSelectedKeys(); this.JSON.visibleEntityFields = this.visibleEntityFields; this.JSON.invisibleEntityFields = this.invisibleEntityFields; //将JSON添加到JSONModel并刷新 this.JSONModel.setData(this.JSON); this.JSONModel.refresh(true); //将oDATA模型设置为核心并刷新 sap.ui.getCore()。setModel(this.oDataModel,'oDataModel'); //sap.ui.getCore()。getModel('oDataModel')。refresh(true); //将JSON模型设置为核心并刷新 sap.ui.getCore()。setModel(this.JSONModel,'JSONModel'); //sap.ui.getCore()。getModel('JSONModel'); //改变视图 this.getRouter()。navTo(" tableView"); }, onExit:function(){ //sap.ui.getCore()。getModel('JSONModel')。refresh(true); //sap.ui.getCore()。getModel('oDataModel')。refresh(true); } }); });
我不确定我是否了解您如何使用odatamodel并将其设置为核心模型,依此类推,但这有效并且更新了第二个视图:
TableViewContent.view.js
您可以看到"国家/地区"表已加载到图像底部的表中。 忽略桌子上的面板:D
TableViewContent.controller.js sap.ui.define([ " DemoApplication/controller/BaseController", " sap/ui/model/json/JSONModel", " DemoApplication/模型/格式程序", " sap/ui/model/Filter", " sap/ui/model/FilterOperator" ],函数(BaseController,JSONModel,格式化程序,Filter,FilterOperator){ "使用严格"; 返回BaseController.extend(" DemoApplication.controller.table.TableViewContent",{ 格式化程序:formatter, onInit:function(){ this.smartTable = sap.ui.getCore()。byId(" smarttable"); }, onBeforeRendering:function(){ //________________________________________________________________ var JSONModel = sap.ui.getCore()。getModel('JSONModel'); //console.log(JSONModel); JSONModel.refresh(true); //console.log(JSONModel); //获取URI var sURI = JSONModel.oData.apiURL; this.oDataModel = new sap.ui.model.odata.ODataModel(sURI,true,JSONModel.oData.username +" @" + JSONModel.oData.instance,JSONModel.oData.password); //选择表 var sEntity = JSONModel.oData.table; //要显示的字段 var visibleEntityFields; //检查用户是否选中了任何特定的列或是否希望全部显示。 如果(JSONModel.oData.chosenEntityFields.length === 0){ visibleEntityFields = JSONModel.oData.visibleEntityFields; }其他{ visibleEntityFields = JSONModel.oData.chosenEntityFields; } //设置头 this.smartTable.setHeader(sEntity); //设置实体集 this.smartTable.setEntitySet(sEntity); //设置可见字段 this.smartTable.setInitiallyVisibleFields(visibleEntityFields); //设置被忽略的字段,即不允许调用的字段 this.smartTable.setIgnoredFields(JSONModel.oData.invisibleEntityFields); //设置模型 this.smartTable.setModel(this.oDataModel); this.getView()。setModel(this.oDataModel); //this.smartTable.getBinding(" columns")。refresh(true); //this.smartTable.getBinding(" items")。refresh(true); //this.smartTable.getModel()。refresh(true); //this.smartTable.rebindTable(true); this.getView()。getModel()。refresh(); this.smartTable.getModel()。updateBindings(); }, onExit:function(){ this.chosenParameters.length = 0; //空数组 //this.smartTable.getBinding()。destroy(); // this.smartTable.exit(); this.oDataModel.stop(); } }); });
请忽略所有注释掉的代码。 仅仅是因为我尝试了不同的方法,却无济于事。 现在的问题是,当我将箭头推回到上一个视图时,选择另一个表或尝试更改任何其他字段并返回该视图,只有表的标题名称发生了变化,但列和加载的项目仍然保留 一样:
对于这段很长的帖子,我感到很抱歉,但是我觉得您需要所有代码才能查明我做错了什么。如果真的有人有时间看一下并给出建议,我将不胜感激。 给我一些帮助或指示。
非常感谢您。
最诚挚的问候,
Emil
(31.7 kB)
你好
如果您仍然有此问题,我可以通过使用rebindChart()来解决相同的问题; 方法。
一周热门 更多>