You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cordova.apache.org by "ASF GitHub Bot (JIRA)" <ji...@apache.org> on 2016/09/23 00:27:20 UTC
[jira] [Commented] (CB-3785) Channel.prototype.subscribe to support
EventListener interface
[ 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-unsubscribe@cordova.apache.org
For additional commands, e-mail: issues-help@cordova.apache.org