cav*_*llo 2 javascript event-listener stimulusjs
我的 HTML 页面上有以下控制器:
...
<div data-controller="parent">
<div data-target="parent.myDiv">
<div data-controller="child">
<span data-target="child.mySpan"></span>
</div>
</div>
</div>
...
Run Code Online (Sandbox Code Playgroud)
该子控制器映射到以下child_controller.js类:
export default class {
static targets = ["mySpan"];
connect() {
document.addEventListener("myEvent", (event) => this.handleMyEvent(event));
}
handleMyEvent(event) {
console.log(event);
this.mySpanTarget; // Manipulate the span. No problem.
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,刺激控制器上有一个事件侦听器connect(),当它检测到事件被触发时,它会记录该事件并操作跨度目标。
myDiv当我从我的目录中替换目标内容时,问题就出现了parent_controller.js:
...
let childControllerHTML = "<div data-controller="child">...</div>"
myDivTarget.innerHTML= childControllerHTML;
...
Run Code Online (Sandbox Code Playgroud)
现在,事件myEvent侦听器已启动,事件侦听器不会选择它一次,而是选择它两次(因为同一事件被记录了两次)。随着子 HTML 的每次替换,该事件都会比以前多记录一次。
我知道可以利用它来document.removeEventListener防止旧控制器仍然监听事件:
export default class {
static targets = ["mySpan"];
connect() {
this.myEventListener = document.addEventListener("myEvent", (event) => this.handleMyEvent(event));
}
disconnect() {
document.removeEventListener("myEvent", this.myEventListener);
}
handleMyEvent(event) {
console.log(event);
this.mySpanTarget; // FAILS. Can't find span.
}
}
Run Code Online (Sandbox Code Playgroud)
但是这样做会使该handleMyEvent方法失去 the context,因为它不再找到mySpanTargetunder this。
如何从我已经无权访问的子控制器中删除侦听器,因为它不再位于 DOM 中,同时保留上下文?
cav*_*llo 10
我在StimulusJS 的 Discourse 页面上找到了答案。
bind初始化控制器时必须使用该方法:
export default class {
static targets = ["mySpan"];
initialize() {
this.boundHandleMyEvent = this.handleMyEvent.bind(this);
}
connect() {
document.addEventListener("myEvent", this.boundHandleMyEvent);
}
disconnect() {
document.removeEventListener("myEvent", this.boundHandleMyEvent);
}
handleMyEvent(event) {
console.log(event);
this.mySpanTarget; // Manipulate the span. No problem.
}
...
}
Run Code Online (Sandbox Code Playgroud)
现在,该事件仅侦听一次,并且方法内的上下文不会丢失handleMyEvent。
| 归档时间: |
|
| 查看次数: |
5680 次 |
| 最近记录: |