Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member182650
Contributor

Motivation

First time we develop complex UIs/Views in SAPUI5 could write 1000-2000 lines in a view. Table creations, forms, layouts, etc. could produce several lines of code. Also we want to standarize our components with same aspect, same styles, same button icons, etc.


SAPUI5 offers a simple mechanism to reuse code: Fragments (https://sapui5.netweaver.ondemand.com/sdk/#docs/guide/Fragments.html).

This blog describes a simple example to create two SAPUI5 tables with one Fragment and reuse table code creation.


NOTE: As of the initial release of Fragments in version 1.15.0 of SAPUI5, they are marked as experimental, so the API can change at any time and they are not guaranteed to work properly.

Step by step

1. Declare your new fragments package.

Remember load new fragment resources in your html file:


sap.ui.localResources("fragment");



2. Create a fragment

This fragment creates a table with data binding, different type columns, etc.


sap.ui.jsfragment("fragment.Table", {
    createContent: function(oController) {
       //Obtain data from controller
       var aData = oController.fragmentInitData.data;
       //Create an instance of the table control
       var oTable = new sap.ui.table.Table({
            title: oController.fragmentInitData.title, //Obtain title from controller
            visibleRowCount: 7
       });
       //Obtain column definition from controller
       for (var i=0; i<oController.fragmentInitData.columns.length; i++) {
            var template;
            //Define the columns and the control templates to be used
            if (oController.fragmentInitData.columns[i].type == "Text")
                 template = new sap.ui.commons.TextView().bindProperty("text", oController.fragmentInitData.columns[i].bindingPath);
            else if (oController.fragmentInitData.columns[i].type == "Rating")
                 template = new sap.ui.commons.RatingIndicator().bindProperty("value", oController.fragmentInitData.columns[i].bindingPath);
            else if (oController.fragmentInitData.columns[i].type == "Checkbox")
                 template = new sap.ui.commons.CheckBox().bindProperty("checked", oController.fragmentInitData.columns[i].bindingPath)
            if (template != undefined) {
                 oTable.addColumn(new sap.ui.table.Column({
                 label: new sap.ui.commons.Label({text: oController.fragmentInitData.columns[i].title}),
                 template:  template,
                 sortProperty: oController.fragmentInitData.columns[i].bindingPath,
                 filterProperty: oController.fragmentInitData.columns[i].bindingPath,
                 width: "200px"
            }));
       }
  }
  var oModel = new sap.ui.model.json.JSONModel();
  oModel.setData({modelData: aData});
  oTable.setModel(oModel);
  oTable.bindRows("/modelData");
  //Initially sort the table
  oTable.sort(oTable.getColumns()[0]);
  //Bring the table onto the UI
  return oTable;
    }
});


3. Use your new fragment

In this view, we reuse the previous fragment twice:


//Define some sample data
var aData = createSampleData();
//Define fragment init data
oController.fragmentInitData = {
       title: "This is a Table Fragment Example",
       data : aData,
       columns: [{title: 'Last Name', bindingPath: 'lastName', type: "Text"},
                            {title: 'Name', bindingPath: 'lastName', type: "Text"},
                            {title: 'Selected', bindingPath: 'checked', type: "Checkbox"},
                            {title: 'Rating', bindingPath: 'rating', type: "Rating"}]
   };
//Instantiate fragment.Table with this init data "oController.fragmentInitData"
var table1 = sap.ui.jsfragment("fragment.Table", oController);
//Define some sample data again
var aData2 = createSampleData();
//Define fragment init data. Different init data this time (different title and less columns).
oController.fragmentInitData = {
       title: "This is a Table Fragment Example 2",
       data : aData,
       columns: [{title: 'Last Name', bindingPath: 'lastName', type: "Text"},
                            {title: 'Name', bindingPath: 'lastName', type: "Text"}]
   };
//Instantiate fragment.Table with this init data "oController.fragmentInitData"
var table2 = sap.ui.jsfragment("fragment.Table", oController);
var oDivider1 = new sap.ui.commons.HorizontalDivider("divider1");
oDivider1.setHeight(sap.ui.commons.HorizontalDividerHeight.Large);
//Present data into VerticalLayout
var oLayout = new sap.ui.layout.VerticalLayout({
       content: [table1, oDivider1, table2]
})



Result

EDIT: JSBin Example

We could reuse our JS code with functions (for example: createTable()), protyping "classes", etc. This is a different SAPUI5 standard way to create common Fragments to be reused in our apps as the same way with "Views".

Enjoy! :wink:

12 Comments
Labels in this area