{"record":{"id":"cfb44ee37b2b910d","repo":"quasarframework/quasar","slug":"tried-to-remove-listener-for-event-event-but","errorCode":null,"errorMessage":"Tried to remove listener for \"${event}\" event but there is no such listener attached.","messagePattern":"Tried to remove listener for \"(.+?)\" event but there is no such listener attached\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"app-vite/exports/bex/private/bex-bridge.js","lineNumber":310,"sourceCode":"    const target = (this.listeners[event] ||= [])\n    target.push({ type: 'once', callback })\n    this.log(`Added a one-time listener for event: \"${event}\".`)\n  }\n\n  /**\n   * @param {string} event\n   * @param {(message: Message) => void} callback\n   */\n  off(event, callback) {\n    if (!event) {\n      this.warn('Tried to remove listeners but no event specified.')\n      return\n    }\n\n    const list = this.listeners[event]\n\n    if (list === void 0) {\n      this.warn(\n        `Tried to remove listener for \"${event}\" event but there is no such listener attached.`\n      )\n      return\n    }\n\n    if (callback === void 0) {\n      if (event.startsWith('@quasar:')) {\n        // ensure we don't remove internal listeners\n        this.listeners[event] = [list[0]]\n      } else {\n        delete this.listeners[event]\n      }\n\n      this.log(`Stopped listening for \"${event}\".`)\n      return\n    }\n\n    if (typeof callback !== 'function') {","sourceCodeStart":292,"sourceCodeEnd":328,"githubUrl":"https://github.com/quasarframework/quasar/blob/4841521b5f635a971eb9e2710e5542efd194691b/app-vite/exports/bex/private/bex-bridge.js#L292-L328","documentation":"BexBridge.off(event, callback) was called for an event name that has no listeners registered at all. The bridge warns and returns without changes.","triggerScenarios":"Removing a listener that was never added (typo in event name), or calling off() after the listener already fired (for once-type) or was already removed.","commonSituations":"Case/typo mismatch between on('Data') and off('data'); double cleanup (both a watcher and unmount hook call off); off() for an event registered only in the other side of the bridge.","solutions":["Confirm the event name exactly matches the one used in on()/once().","Guard cleanup so off() runs only if a listener was registered.","Track registration state to avoid removing twice."],"exampleFix":"// before\nbridge.on('app-opened', handler)\nbridge.off('appOpened', handler) // mismatch\n// after\nconst EVENT = 'app-opened'\nbridge.on(EVENT, handler)\nbridge.off(EVENT, handler)","handlingStrategy":"validation","validationCode":"if (registeredEvents.has(event)) {\n  bridge.off(event, handler)\n  registeredEvents.delete(event)\n}","typeGuard":"const canRemove = (event) => typeof event === 'string' && registeredEvents.has(event)","tryCatchPattern":null,"preventionTips":["Track which listeners you registered and only off() those.","Reuse one constant for on/off event names (avoid literal duplication).","Guard against double cleanup in unmount hooks."],"tags":["bex","extension","event-listener","typo"],"backgroundTag":"listener-not-registered","analyzedSha":"4841521b5f635a971eb9e2710e5542efd194691b","analyzedAt":"2026-08-30T01:13:14.944Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}