2017-05-19 8 views
1

Webサービスを実行してデータを取得するビューのbindElementを呼び出します。 パスのキーが異なる場合、呼び出しは正しく実行されます。 イベント "dataReceived"が同じパスの2回目にトリガされませんでした。SAPUI5 - bindElementが2回目に動作しません

例:

  • 初回:

私はパス 'ABCD' でbindElementを呼び出し、それが働いて、dataReceivedがtrigerredされます。

  • 二回目:

私が注目し、同じパス 'ABCD' を呼び出す場合は、起こっている、イベントdataReceivedはトリガされませんでした。

私は別のパス 'EFGH'を呼び出すと動作し、dataReceivedはtrigerredです。

したがって、パスが同じでも、bindElementを使用してイベントをトリガーするにはどうすればよいですか?

ありがとうございました。

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 });

答えて

0

あなたは二度同じパスでbindElementを呼び出した場合、パスが変更されていないことから、二回目は実際には、新しいデータを取得するために、新しいコールをトリガしません。 2回目の呼び出しがないので、2番目のdataReceivedイベントはありません。

再度トリガーしたい場合は、手動で起動することができます。あなたが応答を取得するときに、サーバーからコードを実行しようとしているよう

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

はあなたのコードに基づいて、それが見えます。 EventProviderクラスのattachEventOnceメソッドを使用します。

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

requestCompletedイベントは、あなたが常に同じコールバック関数を介してすべての要求からすべての応答を実行していない、そのようにデータが一度に戻った後に発射した後、再び起こってからイベントをクリアします。

+0

イベントDataReveivedは、 ')(fireDataReceived。this.getView()。getElementBinding()' でトリガされますがtehのバックオフィスは実行されませんでした。 – Anoiar

+0

コードに基づいて、サーバーからの応答を受け取ったときに関数を実行しようとしているように見えます。私はより良いアプローチは、 'dataReceived'イベントは' attachEventOnce'だと思います。私は上記の私の答えを編集しました。それを試してみてください。 – Kyle

+0

が解決されました。 パスにタイムスタンプを追加して、一意のパスを作成しました。 – Anoiar

1

DataReceivedは、データが受信された場合にのみ発生します。したがって、2回目のデータは要求されないので、dataReceivedは起動されません。

これには「変更」イベントを使用します。

ここに含まれる3つのイベントの例として、発射される順番です。

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

しかし、私の 'bindElement'は' change'、 'dataRequested'と' dataReceived'は呼び出されません、なぜか分かりますか? – Tina

+0

新しいデータが要求されない場合、 'dataRequested'は起動されません。したがって、ブラウザにpreviosリクエストのデータがある場合、モデルはサーバを再度呼び出さず、 'change'だけが起動されます。 もちろん、前もって 'dataRequested'が起動されなかった場合、' dataReceived'は決して起動されません –

関連する問題