SAPUI5 Grundlagen

Laden einzelner Objekte

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.

Ä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

Ä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("detailRoute", {
        invoicePath: window.encodeURIComponent(oItem.getBindingContext("invoice").getPath().substr(1))
      });
    }
webapp/controller/InvoiceList.controller.js

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("detailRoute").attachPatternMatched(this.onObjectMatched, this);
    },

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