2016-11-14 7 views
0

In einem Fragment, das als Dialog verwendet wird, ist es üblich, eine Schaltfläche zum Abbrechen oder Schließen mit einem Pressetermin verknüpft zu haben. Zum Beispiel:Ein Ereignis zum Schließen eines Dialogs/Fragments

<buttons> 
    <Button text="Save" press="onSaveData" type="Accept"/> 
    <Button text="Cancel" press="onCancelBtn" type="Reject"/> 
</buttons> 

Ich habe ein paar Dialoge, die in der aktuellen Ansicht angezeigt Ich arbeite an. Ich möchte die onCancelBtn() Event-Funktion als generisch zu konstruieren, so haben Sie eine close-Funktion, in die das Fragment übergeben und geschlossen wird - ich nehme an, dass das Fragment aus dem Event-Parameter zugänglich ist, aber wie? Würde .getView() nicht die Hauptansicht treffen?

Unten ist meine aktuelle Funktion, aber das bezieht sich auf einen bestimmten Dialog.

onCancelBtn: function(oEvent){ 
     this._oConfirmDialog.close(); 
    }, 

Wie verwende ich oEvent, um einen Verweis auf das Fragment zu erhalten, das ich schließen möchte? Wenn mich jemand auf die Dokumentation des oEvent hinweisen kann, damit ich seine Struktur nachlesen kann, wäre ich dankbar. Ich bin so weit wie die EventProvider in der API-Dokumentation, aber verlor den Pfad dorthin.

Antwort

2

Ein vollständig generischer Ansatz wäre, den Steuerbaum von der Taste zu durchqueren, die das Ereignis nach oben ausgelöst unter Verwendung von Methoden getParent und getMetadata, bis Sie das enthält, Dialogsteuerung Sie schließen mögen erreichen.

Ein anderer Ansatz, den ich besser mag, ist der folgende. Deklarieren Sie ein benutzerdefiniertes Datenattribut, das den Namen der Eigenschaft enthält, die die Dialoginstanz enthält, auf der Schaltfläche "Abbrechen", und bewerten Sie dieses Attribut in einem generischen Ereignishandler.

<Button data:name="MyDialog" text="Cancel" press="onCancelDialogPressed" type="Reject"/> 

können Sie dieses Attribut benutzerdefinierte Daten zugreifen im Ereignishandler:

onCancelDialogPressed : function(event) { 
    var name = event.getSource().data("name"); 
    if (this.fragments[name]) { 
     this.fragments[name].close(); 
    } 
} 

Dies funktioniert, wenn Sie den Dialog wie folgt instanziiert. Sie speichern das Fragment unter dem im benutzerdefinierten Attribut deklarierten Namen.

openDialogPressed : function(event) { 
    if (!this.fragments.MyDialog) { 
     this.fragments.MyDialog = sap.ui.xmlfragment("..") 
     this.getView().addDependent(this.fragments.MyDialog); 
    } 
    this.fragments.MyDialog.open(); 
} 

Natürlich müssen Sie Fragmente in Ihrem Controller deklarieren, z. in OnInit:

this.fragments = {}; 
+0

Interessant. Nur zur Bestätigung, in der onCancelDialogPressed-Funktion, wenn Sie sich auf 'this.fragments [name]' beziehen, muss '[name]' nicht geschrieben werden [[data.name] 'oder ähnlich? –

+1

Meine Schuld. Natürlich müssen Sie den Namen aus den benutzerdefinierten Daten des Steuerelements abrufen. Die Antwort wurde aktualisiert. – matbtt

+0

Danke wird es versuchen und bestätigen. –

1

Es gibt einen besseren und sauberere Weg, dies zu tun - Code unten am Ende Ereignis schreiben:

onClose: function(e) { 
      e.getSource().destroy(); 
     } 
+0

Ein bisschen spät, aber ich muss feststellen, dass dies nicht funktioniert, da getSource Sie auf die Schaltfläche geklickt, nicht auf den Dialog verweist. destroy() muss getSource() aufgerufen werden. getParent(). –

Verwandte Themen