| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 | <!DOCTYPE html><html><head>  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>The source code</title>  <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />  <script type="text/javascript" src="../resources/prettify/prettify.js"></script>  <style type="text/css">    .highlight { display: block; background-color: #ddd; }  </style>  <script type="text/javascript">    function highlight() {      document.getElementById(location.hash.replace(/#/, "")).className = "highlight";    }  </script></head><body onload="prettyPrint(); highlight();">  <pre class="prettyprint lang-js"><span id='Ext-ux-ajax-SimManager'>/**</span> * @author Don Griffin * * This singleton manages simulated Ajax responses. This allows application logic to be * written unaware that its Ajax calls are being handled by simulations ("simlets"). This * is currently done by hooking {@link Ext.data.Connection} methods, so all users of that * class (and {@link Ext.Ajax} since it is a derived class) qualify for simulation. * * The requires hooks are inserted when either the {@link #init} method is called or the * first {@link Ext.ux.ajax.Simlet} is registered. For example: * *      Ext.onReady(function () { *          initAjaxSim(); * *          // normal stuff *      }); * *      function initAjaxSim () { *          Ext.ux.ajax.SimManager.init({ *              delay: 300 *          }).register({ *              '/app/data/url': { *                  stype: 'json',  // use JsonSimlet (stype is like xtype for components) *                  data: [ *                      { foo: 42, bar: 'abc' }, *                      ... *                  ] *              } *          }); *      } * * As many URL's as desired can be registered and associated with a {@link Ext.ux.ajax.Simlet}. To make * non-simulated Ajax requests once this singleton is initialized, add a `nosim:true` option * to the Ajax options: * *      Ext.Ajax.request({ *          url: 'page.php', *          nosim: true, // ignored by normal Ajax request *          params: { *              id: 1 *          }, *          success: function(response){ *              var text = response.responseText; *              // process server response here *          } *      }); */Ext.define('Ext.ux.ajax.SimManager', {    singleton: true,    requires: [        'Ext.data.Connection',        'Ext.ux.ajax.SimXhr',        'Ext.ux.ajax.Simlet',        'Ext.ux.ajax.JsonSimlet'    ],<span id='Ext-ux-ajax-SimManager-cfg-defaultSimlet'>    /**</span>     * @cfg {Ext.ux.ajax.Simlet} defaultSimlet     * The {@link Ext.ux.ajax.Simlet} instance to use for non-matching URL's. By default, this will     * return 404. Set this to null to use real Ajax calls for non-matching URL's.     */<span id='Ext-ux-ajax-SimManager-cfg-defaultType'>    /**</span>     * @cfg {String} defaultType     * The default `stype` to apply to generic {@link Ext.ux.ajax.Simlet} configuration objects. The     * default is 'basic'.     */    defaultType: 'basic',<span id='Ext-ux-ajax-SimManager-cfg-delay'>    /**</span>     * @cfg {Number} delay     * The number of milliseconds to delay before delivering a response to an async request.     */    delay: 150,<span id='Ext-ux-ajax-SimManager-property-ready'>    /**</span>     * @prop {Boolean} ready     * True once this singleton has initialized and applied its Ajax hooks.     * @private     */    ready: false,    constructor: function () {        this.simlets = {};    },    getSimlet: function (url) {        // Strip down to base URL (no query parameters or hash):        var me = this,            index = url.indexOf('?');        if (index < 0) {            index = url.indexOf('#');        }        if (index > 0) {            url = url.substring(0, index);        }        return me.simlets[url] || me.defaultSimlet;    },    getXhr: function (method, url, options, async) {        var simlet = this.getSimlet(url);        if (simlet) {            return simlet.openRequest(method, url, options, async);        }        return null;    },<span id='Ext-ux-ajax-SimManager-method-init'>    /**</span>     * Initializes this singleton and applies configuration options.     * @param {Object} config An optional object with configuration properties to apply.     * @return {Ext.ux.ajax.SimManager} this     * @markdown     */    init: function (config) {        var me = this;        Ext.apply(me, config);        if (!me.ready) {            me.ready = true;            if (!('defaultSimlet' in me)) {                me.defaultSimlet = new Ext.ux.ajax.Simlet({                    status: 404,                    statusText: 'Not Found'                });            }            me._openRequest = Ext.data.Connection.prototype.openRequest;            Ext.data.Connection.override({                openRequest: function (options, requestOptions, async) {                    var xhr = !options.nosim &&                              me.getXhr(requestOptions.method, requestOptions.url, options, async);                    if (!xhr) {                        xhr = this.callParent(arguments);                    }                    return xhr;                }            });            if (Ext.data.JsonP) {                Ext.data.JsonP.self.override({                    createScript: function (url, params, options) {                        var fullUrl = Ext.urlAppend(url, Ext.Object.toQueryString(params)),                            script = !options.nosim &&                                     me.getXhr('GET', fullUrl, options, true);                        if (!script) {                            script = this.callParent(arguments);                        }                        return script;                    },                    loadScript: function (request) {                        var script = request.script;                        if (script.simlet) {                            script.jsonpCallback = request.params[request.callbackKey];                            script.send(null);                        } else {                            this.callParent(arguments);                        }                    }                });            }        }        return me;    },    openRequest: function (method, url, async) {        var opt = {            method: method,            url: url        };        return this._openRequest.call(Ext.data.Connection.prototype, {}, opt, async);    },<span id='Ext-ux-ajax-SimManager-method-register'>    /**</span>     * Registeres one or more {@link Ext.ux.ajax.Simlet} instances.     * @param {Array/Object} simlet Either a {@link Ext.ux.ajax.Simlet} instance or config, an Array     * of such elements or an Object keyed by URL with values that are {@link Ext.ux.ajax.Simlet}     * instances or configs.     * @markdown     */    register: function (simlet) {        var me = this;        me.init();        function reg (one) {            var simlet = one;            if (!simlet.isSimlet) {                simlet = Ext.create('simlet.' + (simlet.stype || me.defaultType), one);            }            me.simlets[one.url] = simlet;            simlet.manager = me;        }        if (Ext.isArray(simlet)) {            Ext.each(simlet, reg);        } else if (simlet.isSimlet || simlet.url) {            reg(simlet);        } else {            Ext.Object.each(simlet, function (url, s) {                s.url = url;                reg(s);            });        }        return me;    }});</pre></body></html>
 |