Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.8.0
-
None
-
All platforms
Description
As number of Cordova-specific events use monkey-patch for add/remove/fire listeners it would be nice if Channel functions support EventListener interface:
- https://developer.mozilla.org/en-US/docs/Web/API/EventListener
- http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener
I assume only a small patch to Channel module is required. Here are the modified functions to resolve the issue:
/** * Subscribes the given function to the channel. Any time that * Channel.fire is called so too will the function. * Optionally specify an execution context for the function * and a guid that can be used to stop subscribing to the channel. * Returns the guid. */ Channel.prototype.subscribe = function(f, c) { var func; if (f && "object" === typeof f) { // EventListener interface func = f["handleEvent"]; c = f; } else { // Function interface func = f; } // need a function to call forceFunction(func); if (this.state == 2) { func.apply(c || this, this.fireArgs); return; } var guid = f.observer_guid; if (typeof c == "object") { func = utils.close(c, func); } if (!guid) { // first time any channel has seen this subscriber guid = '' + nextGuid++; } func.observer_guid = guid; f.observer_guid = guid; // Don't add the same handler more than once. if (!this.handlers[guid]) { this.handlers[guid] = func; this.numHandlers++; if (this.numHandlers == 1) { this.onHasSubscribersChange && this.onHasSubscribersChange(); } } }; /** * Unsubscribes the function with the given guid from the channel. */ Channel.prototype.unsubscribe = function(f) { var func; if (f && "object" === typeof f) { // EventListener interface func = f["handleEvent"]; c = f; } else { // Function interface func = f; } // need a function to unsubscribe forceFunction(func); var guid = f.observer_guid, handler = this.handlers[guid]; if (handler) { delete this.handlers[guid]; this.numHandlers--; if (this.numHandlers === 0) { this.onHasSubscribersChange && this.onHasSubscribersChange(); } } };
Attachments
Issue Links
- is blocked by
-
CB-3786 Event's 'target' and 'currentTarget' are null for monkeypatched events
- Closed
- links to