SAPUI5-绑定更改时,SmartTable不更新

2020-08-18 02:23发布

         点击此处--->   EasySAP.com群内免费提供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)

         点击此处--->   EasySAP.com群内免费提供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)
付费偷看设置
发送
1条回答
软件心理学工程师
1楼-- · 2020-08-18 03:12

你好

如果您仍然有此问题,我可以通过使用rebindChart()来解决相同的问题; 方法。

 var chart = this.getView()。byId(" ItemsSmartChart");

 chart.setEntitySet(" X");

 chart.rebindChart(); 

一周热门 更多>