2017-02-22 1 views
0

Ich habe eine Liste mit Elementen. Nach einem Klick möchte ich einen neuen Dialog öffnen und ihn mit Detailinformationen über das angeklickte Objekt verknüpfen.Dynamische Datenbindung mit Dialog

Meine Datenquelle ist eine SAP-HANA-Datenbank mit einer OData-Schnittstelle. Die Schnittstelle wie folgt aussieht:

Table/Path: Items 
|ID|NAME|PRICE|ITEM_DETAILS (Navigation Property)| 

Table/Path: ItemsDetails 
|ID|ITEM_ID|...| 

Die Liste eine Bindung an Items hat, die funktioniert gut. Mit einem Klick möchte ich meinen Dialog an die Navigationseigenschaft ITEM_DETAILS binden, aber die neue Bindung funktioniert nicht. Der Dialog ist weiterhin bindend/zeigt den "alten" Pfad Items anstelle von ItemsDetails an.

Das Dialogfragment:

<core:FragmentDefinition 
    xmlns="sap.m" 
    xmlns:core="sap.ui.core"> 
    <SelectDialog 
     id="detailInformation" 
     noDataText="No data..." 
     title="{item}"> 
     <StandardListItem 
      title="{ID}" 
      description="{FREQUENCY}" 
      type="Active" /> 
    </SelectDialog> 
</core:FragmentDefinition> 

Der Event-Handler:

if (!this.selectLoadProfile) { 
    this.selectLoadProfile = sap.ui.xmlfragment(this.getView().getId(), "de.xxx.view.fragment.Dialog", this); 
    this.getView().addDependent(this.selectLoadProfile); 
    this.selectLoadProfile.bindElement("ITEM_DETAILS"); 
} 
this.selectLoadProfile.open(); 

Kann mir jemand sagen, wie ich dynamisch die Daten geladen werden können?

Antwort

0

Ihre Frage ist etwas verwirrend ich, was ich davon verstanden habe, Sie haben eine Liste in Ihrer Sicht auf Klick auf Listenelement ein Dialogfeld geöffnet ist, enthält die Elementdetails, die eine Navigationseigenschaft des Elements ist. Unten ist der Code, was Sie versuchen.

this.selectLoadProfile.bindElement("ITEM_DETAILS"); 

Diese Aussage ist nicht spezifisch für welches Element Details, die Sie mit folgendem Bindungspfad zu bind.so versuchen.

this.selectLoadProfile.bindElement("ITEM(id)/ITEM_DETAILS"); 

Wie die obige Aussage ist in der Bedingung (!this.selectLoadProfile) stellen Sie sicher, dass jedes Mal ausführen, so dass die Element-Bindung aktualisieren soll.

Ich hoffe, dass dies für Sie arbeiten wird.

0

Ein Ansatz besteht darin, den Objektpfad im Click-Ereignishandler abzurufen und den ItemDetail-Pfad an Dialog zu binden.

onClick:function(oEvent) { 
    var oControl = oEvent.getSource(); 
    var oItemPath = oControl.getBindingContext().getPath(); 
    var oItemDetailPath = oItemPath + "/ITEM_DETAILS"; 

    if (!this.selectLoadProfile) { 
      this.selectLoadProfile = sap.ui.xmlfragment(this.getView().getId(), 
        "de.xxx.view.fragment.Dialog", this); 
      this.getView().addDependent(this.selectLoadProfile); 

    } 
    this.selectLoadProfile.bindElement(oItemDetailPath); 
    this.selectLoadProfile.open(); 
} 
+0

Okay, jetzt bekomme ich den richtigen Weg. Aber die Details sind immer noch falsch. Die Bindung möchte nicht aktualisiert werden. Wenn ich das '..getModel(). Refresh()' verwende, wird nur die "Eltern" Ansicht aktualisiert. Es sieht so aus, als ob das Fragment vollständig außerhalb des Controls liegt. – Tobias

+0

Haben Sie Ihren ODataModel bindingMode durch setDefaultBindingMode (sap.ui.model.BindingMode.TwoWay) auf ToWay gesetzt? – Allen

+0

Ja, jetzt habe ich ...;) Aber das Problem besteht immer noch. Ich habe den UI5 Inspector für Chrome gefunden und herausgefunden, dass der bindingContext null ist, während meine Arbeitslisten einen bindingContext haben. Könnte das das Problem sein? – Tobias