You can view and download all files at OData V4 - Step 7.
... onInit: function () { ... oViewModel = new JSONModel({ busy : false, hasUIChanges : false, usernameEmpty : false, order : 0 }); ... }, onCreate : function () { var oList = this.byId("peopleList"), oBinding = oList.getBinding("items"), oContext = oBinding.create({ "UserName" : "", "FirstName" : "", "LastName" : "", "Age" : "18" }); this._setUIChanges(); this.getView().getModel("appView").setProperty("/usernameEmpty", true); oList.getItems().some(function (oItem) { if (oItem.getBindingContext() === oContext) { oItem.focus(); oItem.setSelected(true); return true; } }); }, onDelete : function () { var oContext, oSelected = this.byId("peopleList").getSelectedItem(), sUserName; if (oSelected) { oContext = oSelected.getBindingContext(); sUserName = oContext.getProperty("UserName"); oContext.delete().then(function () { MessageToast.show(this._getText("deletionSuccessMessage", sUserName)); }.bind(this), function (oError) { this._setUIChanges(); if (oError.canceled) { MessageToast.show(this._getText("deletionRestoredMessage", sUserName)); return; } MessageBox.error(oError.message + ": " + sUserName); }.bind(this)); this._setUIChanges(true); } }, onInputChange : function (oEvt) { if (oEvt.getParameter("escPressed")) { this._setUIChanges(); } else { this._setUIChanges(true); if (oEvt.getSource().getParent().getBindingContext().getProperty("UserName")) { this.getView().getModel("appView").setProperty("/usernameEmpty", false); } } }, ...
We add the onDelete
event handler to the controller. In the event handler, we check whether an item is selected in the table
and if so, we retrieve the binding context of the selection and call its delete
method. By doing this, the context is
removed from the table on the client side and the deletion is stored as a pending change in the update group of the table's list
binding. A call to _setUIChanges
ensures that the appView
model reflects the deletion as a pending
change and that the Save button becomes enabled. The deletion will be submitted with all other changes related
to the same update group once the Save button is pressed. If the deletion fails on the server side, or the
changes are reset via API, the related entity is restored in the table automatically. To distinguish these two situations, the
rejected error has canceled
set to true
in case of a reset.
<mvc:View controllerName="sap.ui.core.tutorial.odatav4.controller.App" displayBlock="true" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc"> <Shell> <App busy="{appView>/busy}" class="sapUiSizeCompact"> <pages> <Page title="{i18n>peoplePageTitle}"> <content> <Table id="peopleList" growing="true" growingThreshold="10" items="{ path: '/People', parameters: { $count: true, $$updateGroupId : 'peopleGroup' } }" mode="SingleSelectLeft"> <headerToolbar> <OverflowToolbar> <content> <ToolbarSpacer/> <SearchField .../> <Button .../> <Button id="deleteUserButton" icon="sap-icon://delete" tooltip="{i18n>deleteButtonText}" press=".onDelete"> <layoutData> <OverflowToolbarLayoutData priority="NeverOverflow"/> </layoutData> </Button> <Button .../> <Button ...> </content> </OverflowToolbar> </headerToolbar> <columns> ... </columns> <items> ... </items> </Table> </content> <footer> ... </footer> </Page> </pages> </App> </Shell> </mvc:View>
We change the mode
of the table to SingleSelectLeft
to make it possible to select a row.
We add the Delete
button to the toolbar. With the OverflowToolbarLayoutData
priority="NeverOverflow"
parameter, we make sure that the button is
always visible.
... # Toolbar ... #XBUT: Button text for delete user deleteButtonText=Delete User ... # Messages ... #XMSG: Message for user deleted deletionSuccessMessage=User {0} deleted #XMSG: Message for user restored (undeleted) deletionRestoredMessage=User {0} restored ...
We add the missing texts to the properties file.