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