SAPUI5 Grundlagen

Laden einzelner Objekte

(C) Brandeis Consulting.

Motivation

Bislang haben wir immer nur zwischen Seiten gewechselt. Die Inhalte waren aber jeweils fix.

Wir wollen bei der Navigation in die Details die passenden Daten laden und anzeigen.

(C) Brandeis Consulting.

Änderungen 1

manifest.json

In der Route für die Details ändert sich das Pattern:

      "pattern": "detail/{invoicePath}",

Detail-View

In den Details zeigen wir jetzt auch Daten an:

<mvc:View
  controllerName="ui5.walkthrough.controller.Detail"
  xmlns="sap.m"
  xmlns:mvc="sap.ui.core.mvc">
  <Page
    title="{i18n>detailPageTitle}">
    <ObjectHeader
      intro="{invoice>ShipperName}"
      title="{invoice>ProductName}"/>
  </Page>
</mvc:View>
webapp/view/Detail.view.xml
(C) Brandeis Consulting.

Änderungen 2

InvoiceList-Controller

Im InvoiceList Controller müssen wir noch einen Parameter mitgeben, welche Invoice wir anzeigen wollen:

    onPress(oEvent) {
      const oItem = oEvent.getSource();
      const oRouter = this.getOwnerComponent().getRouter();
      oRouter.navTo("detail", {
        invoicePath: window.encodeURIComponent(oItem.getBindingContext("invoice").getPath().substr(1))
      });
    }
webapp/controller/InvoiceList.controller.js
(C) Brandeis Consulting.

Neu: Der Controller für die Details

Die Details müssen noch geladen werden. Damit das funktioniert, wird dem Router eine Callback-Funktion mitgegeben, die aufgerufen werden soll, wenn das Pattern passt:

sap.ui.define([
  "sap/ui/core/mvc/Controller"
], (Controller) => {
  "use strict";

  return Controller.extend("ui5.walkthrough.controller.Detail", {
    onInit() {
      const oRouter = this.getOwnerComponent().getRouter();
      oRouter.getRoute("detail").attachPatternMatched(this.onObjectMatched, this);
    },

    onObjectMatched(oEvent) {
      this.getView().bindElement({
        path: "/" + window.decodeURIComponent(oEvent.getParameter("arguments").invoicePath),
        model: "invoice"
      });
    }
  });
});
webapp/controller/Detail.controller.js
(C) Brandeis Consulting.