我正在尝试使用removeEventDelegate删除事件处理程序,但是它不起作用

时间:2019-08-21 11:06:35

标签: javascript sapui5 event-delegation removeeventlistener

我正在尝试使用removeEventDelegate方法删除事件处理程序,但是它不起作用。

这是我添加eventListener的方式:

appointment.addEventDelegate({
    ondragstart: this.myFunction.bind(this, temp)
})

这是我尝试删除它的方法,但是它不起作用:

appointment.removeEventDelegate({
    ondragstart: this.myFunction.bind(this, temp)
})

2 个答案:

答案 0 :(得分:1)

方法removeEventDelegate等待调用addEventDelegate时传递的相同对象,因为元素在删除时会查找对象 reference (参见source code)。这些功能是否是新的都没关系。

下面是一个演示删除事件委托的示例:

sap.ui.getCore().attachInit(() => sap.ui.require([ "sap/m/ToggleButton" ], ToggleButton => {
  const myDelegate = { // same reference for removing and adding delegate
    onmouseover: () => console.log("mouse hovering"), // e.g.
  };

  const myBtn = new ToggleButton({
    text: "Delegate",
    press: () => !myBtn.getPressed()
      ? myBtn.removeEventDelegate(myDelegate) && console.clear()
      : myBtn.addEventDelegate(myDelegate, this), // `this` should be the controller instance in your case. 
  }).placeAt("content");

}));
console.clear();
<script id="sap-ui-bootstrap" src="https://ui5.sap.com/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.m"
  data-sap-ui-async="true"
  data-sap-ui-theme="sap_fiori_3"
  data-sap-ui-compatversion="edge"
></script>
<body id="content" class="sapUiBody"></body>

因此,您必须将委托对象放在某个地方,以便稍后将其传递给removeEventDelegate。例如,请参见stackoverflow.com/a/56852018

答案 1 :(得分:0)

bind上使用function每次都会创建该功能的新实例。如果您没有引用(指向该实例的变量/属性),则无法在用作侦听器时将其删除。

因此,可以将该实例分配给新变量,或者在不需要/不需要任何未绑定实例的情况下,使用绑定实例覆盖该函数:

this.myFunction = this.myFunction.bind(this, temp)
// or
this.myBoundFunction = this.myFunction.bind(this, temp);

appointment.addEventDelegate({
    ondragstart: this.myFunction
})


appointment.removeEventDelegate({
    ondragstart: this.myFunction
})