Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用命名函数调用附加/分离事件?_Javascript_Sapui5 - Fatal编程技术网

Javascript 如何使用命名函数调用附加/分离事件?

Javascript 如何使用命名函数调用附加/分离事件?,javascript,sapui5,Javascript,Sapui5,我有一个函数,需要将处理程序附加到OData模型的事件“requestCompleted”并将其分离,以便从头部获取URL,以便将数据下载为Excel文件 onClickAction:函数(oEvent){ var model=this.getView().getModel(); model.attachRequestCompleted(this.downloadODataAsExcel); var btnGo=this.getView().byId(“btn”); b.壁炉(); model.

我有一个函数,需要将处理程序附加到OData模型的事件“requestCompleted”并将其分离,以便从头部获取URL,以便将数据下载为Excel文件

onClickAction:函数(oEvent){
var model=this.getView().getModel();
model.attachRequestCompleted(this.downloadODataAsExcel);
var btnGo=this.getView().byId(“btn”);
b.壁炉();
model.detachRequestCompleted(this.downloadODataAsExcel,this);
},
下载ODataasExcel:函数(evt){
var-url;
url=evt.getParameters()&&evt.getParameters().url;
url=“/sap/opu/odata/sap/ZService/”+url+“&$format=xlsx”;
重定向(url,true);
},
我正在尝试在以后分离事件,以防止事件滚雪球,这会导致文件在每次单击下载按钮时下载n+1次


更新:这是我最后得到的代码

onClickAction:函数(oEvent){
var model=this.getView().getModel();
model.attachRequestCompleted(this.downloadOdataAsExcel,this);
var btnGo=this.getView().byId(“btn”);
b.壁炉();
},
下载ODataasExcel:函数(evt){
var-url;
url=evt.getParameters()&&evt.getParameters().url;
url=“/sap/opu/odata/sap/Z_SERVICE/”+url+“&$format=xlsx”;
重定向(url,true);
var model=this.getView().getModel();
model.detachRequestCompleted(this.downloadODataAsExcel,this);
}
分离需要在函数中,否则侦听器将在触发
requestCompleted
事件之前分离。

尝试以下操作:

model.attachRequestCompleted(this.downloadOdataAsExcel,this)


然后尝试访问“evt”对象。

可以通过向方法传递相同的参数列表来附加和分离事件处理程序。例如:

myModel.attachrequestcompleted(this.onRequestCompleted/*.bind*/,this/*在此处传递oListener*/
myModel.分离RequestCompleted(this.onRequestCompleted,this);//同样的args。仍然没有。绑定
“相同的参数列表”,我的意思是:

  • 不要将匿名函数直接作为事件处理程序传递。以后尝试分离时无法引用它

  • 不要使用
    .bind
    直接传递函数,因为它创建了一个新的函数,这同样使分离变得不可能

  • 传递相同的
    oListener
    参考。根据API说明:

    传递的函数侦听器对象必须与用于事件注册的函数匹配

同样的也适用于ManagedObject生成的所有
attach*
/
detach*
方法。

在您的情况下,无法分离处理程序,因为在附加处理程序时,侦听器对象是
未定义的
,而不是


或者,也可以使用

myModel.attacheventon(“requestCompleted”,this.onRequestCompleted,this);

一旦调用了处理程序,它就会自动分离。

事件处理程序可以通过
attachEventOnce
自动分离:只是一个问题,attachRequestCompleted、detach和attachEventOnce的用途是什么?@Jüngealles只是想弄清楚:您是否特别询问
requestCompleted
事件?或者关于附加和分离事件的问题是一般性的?@Jüngealles Ok:)嗯,
requestCompleted
是基本模型提供的一个非常通用的事件。它的用例在很大程度上取决于模型类型和开发人员解决问题的方式。恐怕我不能给出一个明确的答案。问题中显示了一个示例。我个人从未有效地使用过它。但是,如果有人想在每次请求完成时做些什么(无论请求如何结束),这肯定是有帮助的。@Jüngealles
。attach*
。detach*
方法在所有模型、控件等中都可用,因为它们都是从扩展而来的。以声明方式分配事件处理程序时(例如,XML视图中的
press=“.onPress”
),框架会在内部调用.attach。同样地,
attachEvent
也没有明确的“用途”,因为该方法非常通用。@Jüngeals调用
.detach*
方法对于避免内存泄漏或意外调用已销毁的对象非常重要。无论何时附加事件处理程序(例如,当使用ResizeHandler、Router等时),请记住在不再需要它们时也要删除它们。例如,在
onExit
(在Controller中)或
exit
(在controldevelopment中)中,在框架从注册表中删除对象之前调用。