[ https://issues.apache.org/jira/browse/CB-3785?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15514922#comment-15514922 ]
ASF GitHub Bot commented on CB-3785: ------------------------------------ Github user cdebost commented on the issue: https://github.com/apache/cordova-js/pull/130 +1. Without this, frameworks that use EventListener objects as arguments to addEventListener are mostly unusable with Cordova. > Channel.prototype.subscribe to support EventListener interface > -------------------------------------------------------------- > > Key: CB-3785 > URL: https://issues.apache.org/jira/browse/CB-3785 > Project: Apache Cordova > Issue Type: Improvement > Components: CordovaJS > Affects Versions: 2.8.0 > Environment: All platforms > Reporter: Nikolai Kotchetkov > Assignee: Ray Shan > Labels: features, javascript, patch > Original Estimate: 1h > Remaining Estimate: 1h > > 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: > {code:javascript} > /** > * 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(); > } > } > }; > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@cordova.apache.org For additional commands, e-mail: issues-h...@cordova.apache.org