2017-05-19 2 views
1

Ich rufe bindElement der Ansicht, um den Webservice auszuführen und Daten zu erhalten. Der Aufruf wird korrekt ausgeführt, wenn der Schlüssel des Pfades unterschiedlich ist. Das Ereignis "dataReceived" wurde zum zweiten Mal nicht vom selben Pfad ausgelöst.SAPUI5 - bindElement funktioniert das zweite Mal nicht

Beispiel:

  • Das erste Mal: ​​

Ich nenne bindElement mit dem Pfad 'ABCD', es funktioniert, ist DataReceived trigerred.

  • Das zweite Mal: ​​

Wenn ich den gleichen Weg 'ABCD' nennen, unter Hinweis darauf happend ist, hat das Ereignis DataReceived nicht auslösen.

Wenn ich einen anderen Pfad 'EFGH' aufrufen, funktioniert es und dataReceived ist trigerred.

Was kann ich tun, um das Ereignis mit bindElement auszulösen, auch wenn der Pfad derselbe ist?

Danke.

cb = this.getView().byId("cb").getValue(); 
 
vpath = "/ZDECL_INSet('"+ cb +"')"; 
 

 
this.getView().bindElement({ 
 
\t \t \t path: vpath, 
 
\t \t \t mode: sap.ui.model.BindingMode.TwoWay, 
 
\t \t \t events: { 
 
\t \t \t \t dataReceived: function(rData) { 
 

 
\t \t \t \t \t var data = vthis.getView().getModel().getProperty(rData.oSource.sPath); 
 
\t \t \t \t \t msg = ""; 
 

 
\t \t \t \t \t if(data.TMSG1 == 'E'){ 
 
\t \t \t \t \t \t msg = data.Msg1; 
 

 
\t \t \t \t \t \t sap.m.MessageBox.show(msg, { 
 
\t \t \t \t \t \t \t icon: sap.m.MessageBox.Icon.ERROR, 
 
\t \t \t \t \t \t \t title: vtitle, 
 
\t \t \t \t \t \t \t actions: [sap.m.MessageBox.Action.YES], 
 
\t \t \t \t \t \t \t onClose: function(oAction) { 
 

 
\t \t \t \t \t \t \t \t oCB.focus(); 
 
\t \t \t \t \t \t \t \t oCB.setValue(null); 
 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t } 
 
\t \t \t \t \t \t); 
 

 
\t \t \t \t \t } 
 
\t \t \t \t \t else{ 
 
\t \t \t \t \t \t sap.m.MessageToast.show("Good", { 
 
\t \t \t \t \t \t \t duration: 2000, 
 
\t \t \t \t \t \t \t width: "200px" 
 
\t \t \t \t \t \t }); 
 

 
\t \t \t \t \t \t oCB.focus(); 
 
\t \t \t \t \t \t oCB.setValue(null); 
 

 
\t \t \t \t \t } 
 

 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t });

Antwort

0

Wenn Sie bindElement mit dem gleichen Pfad zum zweiten Mal neue Daten nicht wirklich einen neuen Anruf auslösen zweimal rufen, zu erhalten, da der Weg nicht ändern. Da es keinen zweiten Anruf gibt, wird es kein zweites dataReceived Ereignis geben.

Sie können es manuell auslösen, wenn Sie es erneut auslösen möchten.

this.getView().getElementBinding().fireDataReceived()

Basierend auf Ihren Code, es sieht aus wie Sie versuchen, Code aus dem Server auszuführen, wenn Sie die Antwort. Ich würde die Methode attachEventOnce aus der EventProvider-Klasse verwenden.

oModel.attachEventOnce("requestCompleted", function(oEvent) { 
    //execute your code here 
}, this); 
this.getView().bindElement(sPath); 

Das requestCompleted Ereignis wird ausgelöst, nachdem die Daten noch einmal zurück kommen, und dann das Ereignis löschen wieder geschieht, da man so nicht immer jede Antwort von jeder Anforderung durch die gleiche Callback-Funktion ausführen.

+0

Die Veranstaltung DataReveived mit ausgelöst wird 'this.getView(). GetElementBinding(). FireDataReceived()' aber teh Back-Office nicht ausgeführt. – Anoiar

+0

Basierend auf Ihrem Code sieht es so aus, als wollten Sie eine Funktion ausführen, wenn Sie eine Antwort vom Server erhalten. Ich denke, ein besserer Ansatz als das Ereignis "dataReceived" ist "attachEventOnce". Ich habe meine Antwort oben bearbeitet. Bitte versuchen Sie es und lassen Sie es mich wissen. – Kyle

+0

behoben. Ich habe einen Timestanp im Pfad hinzugefügt, um einen eindeutigen Pfad zu haben. – Anoiar

1

DataReceived wird nur ausgelöst, wenn Daten empfangen werden. Daher werden Daten für die zweite Zeit nicht angefordert, sodass dataReceived nicht ausgelöst wird.

Verwenden Sie "Change" -Ereignis dafür.

Als Beispiel für die drei hier beteiligten Ereignisse, in der Reihenfolge, in der sie ausgelöst werden.

events: { 
    dataRequested: function(){ 
     //Here the code to be executed when a request to server was fired. For example, set a "waitingForData" flag to true 
    }, 
    change: function(){ 
     //Here your magic to be executed everytime you do ElementBinding. For example, check if your "waitingForData" flag is false, if so, do whatever you want with the data you already have. 
    }, 
    dataReceived: function(rData){ 
     //Here your logic to be executed when data from server is received. For example, set your "waitingForData" flag to false, and do whatever you want with the data have reveived. 
    } 
} 
+0

Aber mein 'bindElement' feuert nur' change', 'dataRequested' und' dataReceived' wird nicht aufgerufen, weißt du warum? – Tina

+0

'dataRequested' wird nicht ausgelöst, wenn keine neuen Daten angefordert werden. Wenn Sie also die Daten in Ihrem Browser von einer vorherigen Anfrage haben, ruft das Modell den Server nicht erneut auf, und nur 'change' wird ausgelöst. Natürlich wird 'dataReceived' niemals ausgelöst, wenn' dataRequested' vorher nicht ausgelöst wurde –

Verwandte Themen