HarmonyOS鸿蒙Next中求助,emitter使用遇到问题

HarmonyOS鸿蒙Next中求助,emitter使用遇到问题

按照如下代码编写的情况下,不会取消 refreshPage 方法的监听,仍可收到其他地方发送的消息。 如果 emitter.on() 的时候不 bind(this)refreshPage() 方法中的 this = undefined 。

registerEvents() {
    emitter.on(KTXEventKey.login_success_event, this.refreshPage.bind(this))
}

unregisterEvents() {
    emitter.off(KTXEventKey.login_success_event, this.refreshPage)
}

refreshPage() {
    this.controller.refresh()
}

我现在处理方案如下:

static that: TestPage | undefined = undefined

registerEvents() {
    TestPage.that = this
    emitter.on(KTXEventKey.login_success_event, this.refreshPage)
}

unregisterEvents() {
    emitter.off(KTXEventKey.login_success_event, this.refreshPage)
    TestPage.that = undefined
}

refreshPage() {
    const that = TestPage.that as TestPage
    that.controller.refresh()
}

这个方案暂时可以解决我目前的问题,不知道有没有正确的解决方案?


更多关于HarmonyOS鸿蒙Next中求助,emitter使用遇到问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

遇到 this 问题,可以使用箭头函数.

emitter.on(KTXEventKey.login_success_event, ()=> {
  this.refreshPage()
})

更多关于HarmonyOS鸿蒙Next中求助,emitter使用遇到问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,emitter主要用于组件间通信。常见问题可能是事件未触发或监听失效。确保事件名一致,使用emit()发送,on()监听。检查是否在相同Emitter实例上操作。若跨页面通信,需使用globalEmitter。生命周期管理需注意,避免页面销毁后未取消监听导致内存泄漏。代码示例:

// 发送
emitter.emit('eventName', data);

// 监听
emitter.on('eventName', callback);

// 取消
emitter.off('eventName');

在HarmonyOS Next中使用emitter时,bind(this)会创建一个新的函数引用,导致off()无法正确取消监听。正确的解决方案是:

  1. 在类中保存绑定后的函数引用:
private boundRefreshPage = this.refreshPage.bind(this);

registerEvents() {
  emitter.on(KTXEventKey.login_success_event, this.boundRefreshPage)
}

unregisterEvents() {
  emitter.off(KTXEventKey.login_success_event, this.boundRefreshPage)
}
  1. 或者使用箭头函数自动绑定this:
refreshPage = () => {
  this.controller.refresh()
}

registerEvents() {
  emitter.on(KTXEventKey.login_success_event, this.refreshPage)
}

unregisterEvents() {
  emitter.off(KTXEventKey.login_success_event, this.refreshPage)
}

这两种方式都能确保注册和取消使用的是同一个函数引用,同时正确绑定this上下文。你当前的静态变量方案虽然可行,但不是最佳实践,可能会带来内存泄漏风险。

回到顶部