Search code examples
javascriptsapui5

Refresh Fragment in SAPUI5 Application


In my SAPUI5 application I have a JS Fragment that does not update my data. If I refresh the window I get the data correctly, but I need to use window.location.reload().

You can check the code below:

 onInit: function () {
            var oRouters = sap.ui.core.UIComponent.getRouterFor(this);
            oRouters.getRoute("chartContainer").attachPatternMatched(this._onObjectMatched, this);
        },
        _onObjectMatched: function (oEvent) {
            var sYear   = oEvent.getParameter("arguments").Year;
            var sMonth  = oEvent.getParameter("arguments").Month;
            var sGroup = oEvent.getParameter("arguments").Group;
            var sCurrency  = oEvent.getParameter("arguments").Currency;
             if (sYear === undefined && sMonth === undefined && sGroup === undefined && sCurrency === undefined){

                var oStartupParameters = this.getOwnerComponent().getComponentData().startupParameters;

                sYear   = oStartupParameters.Year;

                sMonth  = oStartupParameters.Month;

                sGroup = oStartupParameters.Group;

                sCurrency  = oStartupParameters.Currency


            }

            var sServiceUrl = "/sap/opu/odata/sap/Z_TEST/";
            var filterYear   = new sap.ui.model.Filter("Year",   sap.ui.model.FilterOperator.EQ, sYear);
            var filterMonth  = new sap.ui.model.Filter("Month",  sap.ui.model.FilterOperator.EQ, sMonth);
            var filterGroup = new sap.ui.model.Filter("Group", sap.ui.model.FilterOperator.EQ, sGroup);
            var filterCurrency  = new sap.ui.model.Filter("Currency",  sap.ui.model.FilterOperator.EQ, sCurrency);

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

            oModelOdata.read("/DataSet",{
                       filters: [filterYear, filterMonth, filterGroup, filterCurrency],
                       success: function(oData, response) {
                       var oResults = oData.results;
                       oModel.setData(oData);
                       var oView = sap.ui.getCore().byId("__xmlview0");
                       if (oView !== undefined){
                          oView.setModel(oModel);
                       }else{
                     
                           window.location.reload(); // It works correctly butI would like not to have to reload the whole page.

                     
                       }
                       }
                       });
       },

How could I refresh the view without refreshing the whole page?

Thanks in advance for your support Sergio


Solution

  • You should refresh your model by using the refresh() method:

    oModelOdata.read("/DataSet",{
      filters: [filterYear, filterMonth, filterGroup, filterCurrency],
      success: function(oData, response) {
        var oResults = oData.results;
        oModel.setData(oData);
        var oView = sap.ui.getCore().byId("__xmlview0");
        if (oView !== undefined){
          oView.setModel(oModel);
        }else{
          oModel.refresh(); // refresh new model data bindings
        }
      }
    });
    

    You should also use promises when making the API call to get the data.