http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89913
Revision: 89913 Author: neilk Date: 2011-06-12 05:13:59 +0000 (Sun, 12 Jun 2011) Log Message: ----------- readiness events, that can occur only once, and can be subscribed to even if already occured Modified Paths: -------------- trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js Modified: trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js =================================================================== --- trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js 2011-06-12 02:58:13 UTC (rev 89912) +++ trunk/extensions/UploadWizard/resources/jquery/jquery.pubsub.js 2011-06-12 05:13:59 UTC (rev 89913) @@ -2,6 +2,9 @@ * Minimal pubsub framework * * Loosely based on https://github.com/phiggins42/bloody-jquery-plugins/pubsub.js, which is itself BSD-licensed. + * Concept of 'ready' events is new, though. + * + * @author Neil Kandalgaonkar <ne...@wikimedia.org> */ ( function( $ ) { @@ -9,6 +12,11 @@ * Store of events -> array of listener callbacks */ var subs = {}; + + /** + * Store of ready events, as object of event name -> argument array + */ + var ready = {}; /** * Publish an event @@ -18,27 +26,60 @@ */ $.publish = function( name /* , args... */ ) { var args = [].slice.call( arguments, 1 ); - $.each( subs[name], function( i, sub ) { - sub.apply( null, args ); - } ); - return subs[name].length; + if ( typeof subs[name] !== 'undefined' && subs[name] instanceof Array ) { + $.each( subs[name], function( i, sub ) { + sub.apply( null, args ); + } ); + return subs[name].length; + } + return 0; }; /** + * Publish a ready event. Ready events occur once only, so + * subscribers will be called even if they subscribe later. + * Additional variadic arguments after the event name are passed as arguments to the subscriber functions + * @param {String} name of event + * @return {Number} number of subscribers + */ + $.publishReady = function( name /*, args... */ ) { + if ( typeof ready[name] === 'undefined' ) { + var args = [].slice.call( arguments, 1 ); + ready[name] = args; + $.publish.apply( null, arguments ); + } + }; + + /** * Subscribe to an event. * @param {String} name of event to listen for * @param {Function} callback to run when event occurs * @return {Array} returns handle which can be used as argument to unsubscribe() */ $.subscribe = function( name, fn ) { - if (!subs[name]) { + if ( typeof subs[name] === 'undefined' ) { subs[name] = []; } - subs[name].push(fn); + subs[name].push( fn ); return [ name, fn ]; }; /** + * Subscribe to a ready event. See publishReady(). + * Subscribers will be called even if they subscribe long after the event fired. + * @param {String} name of event to listen for + * @param {Function} callback to run now (if event already occurred) or when event occurs + * @return {Array} returns handle which can be used as argument to unsubscribe() + */ + $.subscribeReady = function( name, fn ) { + if ( ready[name] ) { + fn.apply( null, ready[name] ); + } else { + $.subscribe( name, fn ); + } + }; + + /** * Given the handle of a particular subscription, remove it * @param {Array} object returned by subscribe ( array of event name and callback ) * @return {Boolean} success _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs