我调用视图的bindElement来执行Web服务并获取数据。如果路径的键不同,则调用将正确执行。事件"dataReceived"未在同一路径的第二次触发。
例:
- 第一次:
我用路径"ABCD"调用bindElement,它正在工作,dataReceived是trigerred。
- 第二次:
如果我调用相同的路径"ABCD",注意发生了,事件 dataReceived 没有触发。
如果我称另一条路径为"EFGH",它正在工作并且 dataReceived 是三重的。
那么即使路径相同,我该怎么做才能使用 bindElement 触发事件呢?
谢谢。
cb = this.getView().byId("cb").getValue();
vpath = "/ZDECL_INSet('"+ cb +"')";
this.getView().bindElement({
path: vpath,
mode: sap.ui.model.BindingMode.TwoWay,
events: {
dataReceived: function(rData) {
var data = vthis.getView().getModel().getProperty(rData.oSource.sPath);
msg = "";
if(data.TMSG1 == 'E'){
msg = data.Msg1;
sap.m.MessageBox.show(msg, {
icon: sap.m.MessageBox.Icon.ERROR,
title: vtitle,
actions: [sap.m.MessageBox.Action.YES],
onClose: function(oAction) {
oCB.focus();
oCB.setValue(null);
}
}
);
}
else{
sap.m.MessageToast.show("Good", {
duration: 2000,
width: "200px"
});
oCB.focus();
oCB.setValue(null);
}
}
}
});
只有在收到数据时才会触发 DataReceived。所以第二次数据不会被请求,所以数据接收不会被触发。
为此使用"更改"事件。
作为此处涉及的三个事件的示例,按触发顺序排列。
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.
}
}
如果您两次使用相同的路径调用bindElement
,第二次实际上不会触发新调用以获取新数据,因为路径没有更改。由于不会有第二次通话,因此不会有第二次dataReceived
事件。
如果要再次触发它,可以手动触发它。
this.getView().getElementBinding().fireDataReceived()
根据您的代码,当您收到响应时,您似乎正在尝试从服务器执行代码。我将使用 EventProvider 类中的 attachEventOnce
方法。
oModel.attachEventOnce("requestCompleted", function(oEvent) {
//execute your code here
}, this);
this.getView().bindElement(sPath);
requestCompleted 事件将在数据返回一次后触发,然后清除事件不再发生,这样您就不会总是通过相同的回调函数运行每个请求的每个响应。