2017-01-23 2 views
0

Nach meiner Frage über Is it possible to use 2 models in one view bin ich jetzt verwirrt darüber, wie bindElement auf ein Formular in einem XML-Fragment anzuwenden.BindElement() auf Formular in Popup-Dialog/Fragment

Das Fragment (Schnitt der Kürze nach unten):

<core:FragmentDefinition 
    namespaces here...> 
    <Dialog id="theDialogId" title="Edit Subdetail"> 
     <content> 
      <f:SimpleForm id="EditFormId" editable="true" > 
       <f:content> 
        <Label id="lblName" text="Name" labelFor="inpName" /> 
        <Input id="inpName" editable="true" value="{name}"/> 
       </f:content> 
      </f:SimpleForm> 
     </content> 
    </Dialog> 
</core:FragmentDefinition> 

Die Herausforderung: Angenommen, ich habe einen Modellpfad enthält /master/0/detail/6/subdetail/2 - wie die Simple auf diesen Weg zu binden? Im die Beispiele, die ich gesehen habe, Elemente in Dialogen gegeben werden, einen Wert von

sap.ui.getCore().byId("inputId").setValue("some value) 

und der Zugriff über

var uid = sap.ui.getCore().byId("inputId").getValue() 

aber ich möchte den Weg Bindung verwenden.

Das Problem, das ich habe, ist, wie man einen Verweis auf die SimpleForm bekommen, so dass ich bindElement() verwenden kann.

Wenn dies eine Ansicht wäre, würde ich verwenden

var theForm = this.getView().byId("EditFormId"); 

var oBindingContext = event.oSource.getBindingContext(); 
theForm.bindElement(oBindingContext.getPath()) 

jedoch Fragmente sind nicht fest mit der Ansicht verbunden ist, so wird dies nicht funktionieren. Stattdessen glaube ich

var dlgForm = sap.ui.core.Fragment.byId("theFragmentId", "EditFormId") 

var oBindingContext = event.oSource.getBindingContext(); 
dlgForm.bindElement(oBindingContext.getPath()) 

Dies kann auch richtig sein, verwenden, aber ich bin ratlos, wie die „theFragmentId“ in der XML-Ansicht Erklärung anzuwenden. Kann jemand den Nebel für mich klären?

EDIT: Was ich vermisse, wie die akzeptierte Antwort, ist, dass die gewünschte Fragment-ID als der erste (optionale) Parameter der Funktion sap.ui.xmlfragment() gegeben werden kann. Der Schlüssel zum Binden an ein fragmentbasiertes Steuerelement besteht darin, eine Kennung dafür zu erhalten, aber die Funktion sap.ui.core.Fragment.byId (fragId, ctrlId) benötigt eine Fragment-ID. Mein Problem war, dass ich auf die XML-Fragment-Deklaration fixiert war und wie man dort eine ID anwendet. Das fühlt sich innerhalb von SAPUI5 inkonsistent an, aber ich denke, dass die Möglichkeit, eine ID auf das Fragment anzuwenden, irgendwo eine gewisse Annehmlichkeit hat.

Antwort

2

Sie so etwas wie dieses versuchen ...

onOpenDialog: function(oEvent) { 
    if(!this._oEditSubDetailDialog){ 
      this._oEditSubDetailDialog = sap.ui.xmlfragment("fragmentId", "namespace.and.path.to.your.fragment", this); 
      this.getView().addDependent(this._oEditSubDetailDialog); 
    } 

    var sPathToBind = oEvent.getSource().getBindingContext().getPath(); 
    sap.ui.core.Fragment.byId("fragmentId","EditFormId").bindElement(sPathToBind); 

    this._oEditSubDetailDialog.open(); 
} 

... müssen nur sicherstellen, dass die Quelle die Kontrolle über die Veranstaltung den Kontext daran gebunden hat, die Sie bearbeiten möchten.

Sie auch direkt auf dem Dialog bindElement könnte, auf diese Weise Sie nicht brauchen würde, die Form Kontrolle im Dialog abrufen ...

this._oEditSubDetailDialog.bindElement(sPathToBind) 

This API documentation und this walkthrough guide in Bezug auf XML-Fragmente können nützlich

+0

Dank sein Ian. Ihr Beispielcode und die Verknüpfung mit den API-Dokumenten haben den Punkt beleuchtet, dass die gewünschte Fragment-ID als erster (optionaler) Parameter der Funktion sap.ui.xmlfragment() angegeben werden kann - etwas, das ich nicht in allen Beispielen gesehen hatte gesehen, einschließlich Abschnitt 16 der Walkthrough, die eine einfache Bestätigung/Reset-Dialog Beispiel ist. –

+0

sap.ui.core.Fragment.byId ("fragmentId", "EditFormId"). BindElement (sPathToBind); Warum dieses sPathToBind? Ich habe zwei Modelle oModel1 ist für Tabellenbindung in Sicht. oModel2 dient zur Fragmentbindung. this.getView(). setModel (oModell1, "Tabelle"); this.getView(). setModel (oModell2, "list"); Ist das möglich? –

+0

Mein Problem wurde gelöst durch 'this._oEditSubDetailDialog.setModel (this.getOwnerComponent(). GetModel (" myModel "))' & 'this._oEditSubDetailDialog.bindElement (sPathToBind)' – Tina