Show TOC

Dynamische Einbettung einer Interface-ViewLocate this document in the navigation structure

Eine Interface-View einer dynamisch eingebetteten Component muss auch dynamisch in die Navigation eines Windows eingebunden werden. Dies kann zum Beispiel in einer Methode des Controllers derjenigen View implementiert werden, von der die Navigation ausgehen soll.  Das folgende Code-Fragment zeigt zunächst die Instanziierung der dynamisch eingebetteten Component.

data: L_VIEW_CONTROLLER_API type ref to IF_WD_VIEW_CONTROLLER,
L_COMPONENT_USAGE type ref to IF_WD_COMPONENT_USAGE,
COMPONENT_NAME    type STRING.
if L_COMPONENT_USAGE->HAS_ACTIVE_COMPONENT( ) is initial.
L_COMPONENT_USAGE->CREATE_COMPONENT( COMPONENT_NAME ).
endif.

Im weiteren Verlauf wird die Methode PREPARE_DYNAMIC_NAVIGATION des Laufzeit-APIs des View-Controllers gerufen. Alle Attribute der eigenen, also der verwendenden Component, sind bekannt und können fest implementiert werden (source-Attribute). Alle Attribute der verwendeten Component sind zur Design-Zeit nicht bekannt und werden als Variablen übergeben (target-Attribue, Werte sind als Platzhalter in spitzen Klammern dargestellt).

L_VIEW_CONTROLLER_API = WD_THIS->WD_GET_API( ).
L_VIEW_CONTROLLER_API->PREPARE_DYNAMIC_NAVIGATION(
source_window_name          = 'W0'
source_vusage_name          = 'MAIN_USAGE_1'
source_plug_name            = 'TO_V1'
target_component_name       = <component_name>
target_component_usage      = <component_usage_name>
target_view_name            = <interface_view_name>
target_plug_name            = <inbound_plug_name>
target_embedding_position   = <embedding_position> ).

Die Methode PREPARE_DYNAMIC_NAVIGATION der API des View-Controllers bettet die Interface-View <interface_view_name> der Component <component_name> an die entsprechende Einbettungsposition <embedding_position> ein. Außerdem wird ein Navigationslink vom Outbound-Plug TO_V1 der View MAIN zum Inbound-Plug <inbound_plug_name> der Interface-View <interface_view_name> angelegt. Die in <component_name> angegebene Component muss das Component-Interface implementieren, auf das die Component-Verwendung <component_usage_name> zeigt.

Im letzen Schritt dieses Fragments wird dann der Outbound-Plug gerufen.

WD_THIS->FIRE_TO_V1_PLG( ).
Tipp In der  Beispiel-Anwendung WDR_TEST_DYNAMIC wird das Component-Interface WDR_TEST_DYNAMIC_CI  von den Components WDR_TEST_DYNAMIC_1, WDR_TEST_DYNAMIC_2 und WDR_TEST_DYNAMIC_3  implementiert.
Hinweis Die Methode PREPARE_DYNAMIC_NAVIGATION muss im Phasenmodell bis einschließlich der Phase DO_BEFORE_NAVIGATION, idealerweise in einem Aktionsbehandler, aufgerufen werden, da sonst keine Navigation stattfindet.

Die Einbettungsposition der Interface-View

Bei der Einbettung der Interface-View können verschiedene Fälle relevant sein :

  • Soll die Interface-View direkt in ein Window der verwendenden Component eingebettet werden, brauchen Sie keine weiteren Schritte zu unternehmen. Mit der Angabe des Wertes für das Attribut <embedding_position> wird die Anzeige der Interface-View innerhalb des ausgewählten Windows automatisch getriggert.
  • Wenn Sie die Interface-View jedoch in einer View innerhalb des Windows der verwendenden Component anzeigen wollen, wird die Interface-View nur dann beim Rendering-Vorgang berücksichtigt, wenn sie in ein View-Container-Element innerhalb der einbettenden View positioniert wurde:

Dieses View-Container-Element kann in der einbettenden View vorhanden, weil statisch deklariert worden, sein. Auch in diesem Fall wird die eingebettete Interface-View nach Angabe des View-Container-Elements als Wert für die Einbettungsposition in der Methode PREPARE_DYNAMIC_NAVIGATION automatisch und zwar zusammen mit der einbettenden View angezeigt.

Es kann jedoch auch der Fall eintreten, dass der View-Container dynamisch zur Laufzeit erst erzeugt werden muss. Das folgende Code-Fragment zeigt ein Beispiel für die Erzeugung eines solchen zusätzlichen Containers, die immer in  der Methode WDDOMODIFYVIEW der betreffenden View programmiert werden muss:

data: L_ROOT_CNT           type ref to CL_WD_UIELEMENT_CONTAINER,
L_VIEW_CNT           type ref to CL_WD_VIEW_CONTAINER_UIELEMENT,
L_MATRIX_HEAD_DATA   type ref to CL_WD_MATRIX_HEAD_DATA.
if first time = abap_true.
L_ROOT_CNT ?= VIEW->GET_ELEMENT( 'ROOTUIELEMENTCONTAINER' ).
L_VIEW_CNT  = CL_WD_VIEW_CONTAINER_UIELEMENT=>NEW_VIEW_CONTAINER_UIELEMENT(
ID = 'CNT1' ).
L_ROOT_CNT->ADD_CHILD( L_VIEW_CNT ).
L_MATRIX_HEAD_DATA = CL_WD_MATRIX_HEAD_DATA=>NEW_MATRIX_HEAD_DATA(
ELEMENT = L_VIEW_CNT ).
endif.
Hinweis Der Name des dynamisch erzeugten View-Container-Elements wird der Methode PREPARE_DYNAMIC_NAVIGATION bereits übergeben, obwohl das Element erst zu einem späteren Zeitpunkt im Phasenmodell erzeugt wird.