OpenLayers OpenLayers

Changeset 5398

Show
Ignore:
Timestamp:
12/13/07 12:30:52 (1 year ago)
Author:
tschaub
Message:

triggerEvent can now be called with additional arguments for the listeners - this means instead of getting news like 'hey, someone won the lottery' listeners now get news like 'hey, you won the lottery' - in addition, the triggerer gets back the return from the listener, so if a listener wants to say 'dont tell anyone else' the triggerer gets that message - thanks for the reviews (closes #1189)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/openlayers/lib/OpenLayers/Events.js

    r5241 r5398  
    587587    /** 
    588588     * APIMethod: triggerEvent 
    589      * Trigger a specified registered event 
     589     * Trigger a specified registered event 
    590590     *  
    591591     * Parameters: 
    592592     * type - {String}  
    593      * evt - {Event}  
    594      */ 
    595     triggerEvent: function (type, evt) { 
     593     * evt - {Event} 
     594     * args - {Array} Optional array of arguments to call the listener with. 
     595     * 
     596     * Returns: 
     597     * {Boolean} The last listener return.  If a listener returns false, the 
     598     *     chain of listeners will stop getting called. 
     599     */ 
     600    triggerEvent: function (type, evt, args) { 
    596601 
    597602        // prep evt object with object & div references 
     
    601606        evt.object = this.object; 
    602607        evt.element = this.element; 
     608         
     609        if(!args) { 
     610            args = [evt]; 
     611        } else { 
     612            args.unshift(evt); 
     613        } 
    603614 
    604615        // execute all callbacks registered for specified type 
     
    608619                            this.listeners[type].slice() : null; 
    609620        if ((listeners != null) && (listeners.length > 0)) { 
     621            var continueChain; 
    610622            for (var i = 0; i < listeners.length; i++) { 
    611623                var callback = listeners[i]; 
    612                 var continueChain; 
    613                 if (callback.obj != null) { 
    614                     // use the 'call' method to bind the context to callback.obj 
    615                     continueChain = callback.func.call(callback.obj, evt); 
    616                 } else { 
    617                     continueChain = callback.func(evt); 
    618                 } 
    619      
    620                 if ((continueChain != null) && (continueChain == false)) { 
     624                // bind the context to callback.obj 
     625                continueChain = callback.func.apply(callback.obj, args); 
     626     
     627                if ((continueChain != undefined) && (continueChain == false)) { 
    621628                    // if callback returns false, execute no more callbacks. 
    622629                    break; 
     
    628635            } 
    629636        } 
     637        return continueChain; 
    630638    }, 
    631639 
  • trunk/openlayers/tests/test_Events.html

    r4271 r5398  
    153153    function test_04_Events_triggerEvent(t) { 
    154154     
    155         t.plan( 6 ); 
     155        t.plan(13); 
    156156  
    157157        var mapDiv = OpenLayers.Util.getElement('map'); 
     
    200200        events.triggerEvent("doThingC"); 
    201201 
    202         t.eq(a, 5, "if Events has no object set and an event is registered also with no object, triggerEvent() calls it without trying to set the context to null");         
     202        t.eq(a, 5, "if Events has no object set and an event is registered also with no object, triggerEvent() calls it without trying to set the context to null"); 
     203         
     204        // trigger events with additional arguments 
     205        eventTypes = ["something"]; 
     206        events = new OpenLayers.Events(null, null, eventTypes); 
     207        var instance = {id: Math.random()}; 
     208        var listener = function() { 
     209            t.eq(this.id, instance.id, 
     210                 "listener called with proper scope"); 
     211            t.eq(arguments[0].id, evt.id, 
     212                 "listener called with evt as first arg"); 
     213            t.eq(arguments[1], "arg1", 
     214                 "listener called with correct extra arg1"); 
     215            t.eq(arguments[2], "arg2", 
     216                 "listener called with correct extra arg2"); 
     217        }; 
     218        events.register("something", instance, listener);         
     219        var evt = {id: Math.random()}; 
     220        events.triggerEvent("something", evt, ["arg1", "arg2", "arg3"]); 
     221        events.unregister("something", instance, listener); 
     222         
     223        // test return from triggerEvent 
     224        var listener1 = function() { 
     225            return "foo"; 
     226        } 
     227        var listener2 = function() { 
     228            return false; 
     229        } 
     230        var listener3 = function() { 
     231            t.fail("never call me again!"); 
     232        } 
     233        events.register("something", instance, listener1); 
     234        var ret = events.triggerEvent("something", evt); 
     235        t.eq(ret, "foo", "correct return from single listener"); 
     236         
     237        events.register("something", instance, listener2); 
     238        ret = events.triggerEvent("something", evt); 
     239        t.eq(ret, false, "correct return for two listeners"); 
     240         
     241        events.register("something", instance, listener3); 
     242        ret = events.triggerEvent("something", evt); 
     243        t.eq(ret, false, "correct return for three listeners where second cancels"); 
     244         
     245        events.unregister("something", instance, listener1); 
     246        events.unregister("something", instance, listener2); 
     247        events.unregister("something", instance, listener3); 
     248         
    203249    } 
    204250