In Step 6 , we stated that the fields in a resource model are arranged in a flat structure; in other words, there is no hierarchy of properties. However, this is only true for resource models. The properties within JSON and OData models are usually arranged in a hierarchical structure. So, let's explore how to reference fields in a hierarchically structured model object.
A second panel with address data is added
You can view and download all files in the Demo Kit at Data Binding - Step 8.
-
In the
data.json
file, add an additional sub-object namedaddress
. This object has four properties:street
,city
,zip
, andcountry
.webapp/model/data.json
{ "firstName": "Harry", "lastName": "Hawk", "enabled": true, "address": { "street": "Dietmar-Hopp-Allee 16", "city": "Walldorf", "zip": "69190", "country": "Germany" } }
-
Add a new panel to the
App.view.xml
with a newLabel
andFormattedText
pair of elements.The
text
property of theLabel
element is bound to the i18n resource bundle fieldaddress
.The
htmlText
property of theFormattedText
element is bound to four JSON model properties:/address/street
,/address/zip
,/address/city
, and/address/country
. You can achieve the resulting address format by separating each one of these JSON model property references with a hard-coded newline character. Note thatzip
andcity
are separated by a space.webapp/view/App.view.xml
<mvc:View xmlns="sap.m" xmlns:form="sap.ui.layout.form" xmlns:l="sap.ui.layout" xmlns:mvc="sap.ui.core.mvc"> <Panel headerText="{i18n>panel1HeaderText}" class="sapUiResponsiveMargin" width="auto"> <form:SimpleForm editable="true" layout="ColumnLayout"> <Label text="{i18n>firstName}"/> <Input value="{/firstName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}"/> <Label text="{i18n>lastName}"/> <Input value="{/lastName}" valueLiveUpdate="true" width="200px" enabled="{/enabled}"/> <Label text="{i18n>enabled}"/> <CheckBox selected="{/enabled}"/> </form:SimpleForm> </Panel> <Panel headerText="{i18n>panel2HeaderText}" class="sapUiResponsiveMargin" width="auto"> <content> <l:VerticalLayout> <Label labelFor="address" text="{i18n>address}:"/> <FormattedText class="sapUiSmallMarginBottom" htmlText="{/address/street}<br>{/address/zip} {/address/city}<br>{/address/country}" id="address" width="200px"/> </l:VerticalLayout> </content> </Panel> </mvc:View>
-
Update the
i18n.properties
andi18n_de.properties
files as shown below.webapp/i18n/i18n.properties
# Field labels firstName=First Name lastName=Last Name enabled=Enabled address=Address # Screen titles panel1HeaderText=Data Binding Basics panel2HeaderText=Address Details
webapp/i18n/i18n_de.properties
# Field labels firstName=Vorname lastName=Nachname enabled=Aktiviert address=Adresse # Screen titles panel1HeaderText=Data Binding Grundlagen panel2HeaderText=Adressdetails
The resource bundle files now contain new properties for the address and a new panel header text. Both panel properties are numbered.
In the XML view, inside the curly brackets for the binding path of the
htmlText
element, you'll notice that the first character is a forward slash. This is necessary for binding paths that make absolute references to properties in JSON and OData models, but you must not use it for resource models. After the first forward slash character, the binding path syntax uses the object name and the property names separated by forward slash characters ({/address/street}
).Remember, all binding path names are case-sensitive.
Related Information