4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <title>The source code</title>
6 <link href="../prettify/prettify.css" type="text/css" rel="stylesheet" />
7 <script type="text/javascript" src="../prettify/prettify.js"></script>
8 <style type="text/css">
9 .highlight { display: block; background-color: #ddd; }
11 <script type="text/javascript">
12 function highlight() {
13 document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
17 <body onload="prettyPrint(); highlight();">
18 <pre class="prettyprint lang-js"><span id='Ext-direct-Manager'>/**
19 </span> * @class Ext.direct.Manager
20 * <p><b><u>Overview</u></b></p>
22 * <p>Ext.Direct aims to streamline communication between the client and server
23 * by providing a single interface that reduces the amount of common code
24 * typically required to validate data and handle returned data packets
25 * (reading data, error conditions, etc).</p>
27 * <p>The Ext.direct namespace includes several classes for a closer integration
28 * with the server-side. The Ext.data namespace also includes classes for working
29 * with Ext.data.Stores which are backed by data from an Ext.Direct method.</p>
31 * <p><b><u>Specification</u></b></p>
33 * <p>For additional information consult the
34 * <a href="http://sencha.com/products/extjs/extdirect">Ext.Direct Specification</a>.</p>
36 * <p><b><u>Providers</u></b></p>
38 * <p>Ext.Direct uses a provider architecture, where one or more providers are
39 * used to transport data to and from the server. There are several providers
40 * that exist in the core at the moment:</p><div class="mdetail-params"><ul>
42 * <li>{@link Ext.direct.JsonProvider JsonProvider} for simple JSON operations</li>
43 * <li>{@link Ext.direct.PollingProvider PollingProvider} for repeated requests</li>
44 * <li>{@link Ext.direct.RemotingProvider RemotingProvider} exposes server side
45 * on the client.</li>
46 * </ul></div>
48 * <p>A provider does not need to be invoked directly, providers are added via
49 * {@link Ext.direct.Manager}.{@link Ext.direct.Manager#addProvider addProvider}.</p>
51 * <p><b><u>Router</u></b></p>
53 * <p>Ext.Direct utilizes a "router" on the server to direct requests from the client
54 * to the appropriate server-side method. Because the Ext.Direct API is completely
55 * platform-agnostic, you could completely swap out a Java based server solution
56 * and replace it with one that uses C# without changing the client side JavaScript
59 * <p><b><u>Server side events</u></b></p>
61 * <p>Custom events from the server may be handled by the client by adding
62 * listeners, for example:</p>
63 * <pre><code>
64 {"type":"event","name":"message","data":"Successfully polled at: 11:19:30 am"}
66 // add a handler for a 'message' event sent by the server
67 Ext.direct.Manager.on('message', function(e){
68 out.append(String.format('&lt;p>&lt;i>{0}&lt;/i>&lt;/p>', e.data));
69 out.el.scrollTo('t', 100000, true);
71 * </code></pre>
75 Ext.define('Ext.direct.Manager', {
77 /* Begin Definitions */
81 observable: 'Ext.util.Observable'
84 requires: ['Ext.util.MixedCollection'],
97 constructor: function(){
101 <span id='Ext-direct-Manager-event-event'> /**
102 </span> * @event event
103 * Fires after an event.
104 * @param {event} e The Ext.direct.Event type that occurred.
105 * @param {Ext.direct.Provider} provider The {@link Ext.direct.Provider Provider}.
108 <span id='Ext-direct-Manager-event-exception'> /**
109 </span> * @event exception
110 * Fires after an event exception.
111 * @param {event} e The Ext.direct.Event type that occurred.
115 me.transactions = Ext.create('Ext.util.MixedCollection');
116 me.providers = Ext.create('Ext.util.MixedCollection');
118 me.mixins.observable.constructor.call(me);
121 <span id='Ext-direct-Manager-method-addProvider'> /**
122 </span> * Adds an Ext.Direct Provider and creates the proxy or stub methods to execute server-side methods.
123 * If the provider is not already connected, it will auto-connect.
124 * <pre><code>
125 var pollProv = new Ext.direct.PollingProvider({
129 Ext.direct.Manager.addProvider({
130 "type":"remoting", // create a {@link Ext.direct.RemotingProvider}
131 "url":"php\/router.php", // url to connect to the Ext.Direct server-side router.
132 "actions":{ // each property within the actions object represents a Class
133 "TestAction":[ // array of methods within each server side Class
135 "name":"doEcho", // name of method
138 "name":"multiply",
141 "name":"doForm",
142 "formHandler":true, // handle form on server with Ext.Direct.Transaction
146 "namespace":"myApplication",// namespace to create the Remoting Provider in
148 type: 'polling', // create a {@link Ext.direct.PollingProvider}
150 }, pollProv); // reference to previously created instance
151 * </code></pre>
152 * @param {Object/Array} provider Accepts either an Array of Provider descriptions (an instance
153 * or config object for a Provider) or any number of Provider descriptions as arguments. Each
154 * Provider description instructs Ext.Direct how to create client-side stub methods.
156 addProvider : function(provider){
162 if (args.length > 1) {
163 for (len = args.length; i < len; ++i) {
164 me.addProvider(args[i]);
169 // if provider has not already been instantiated
170 if (!provider.isProvider) {
171 provider = Ext.create('direct.' + provider.type + 'provider', provider);
173 me.providers.add(provider);
174 provider.on('data', me.onProviderData, me);
177 if (!provider.isConnected()) {
184 <span id='Ext-direct-Manager-method-getProvider'> /**
185 </span> * Retrieve a {@link Ext.direct.Provider provider} by the
186 * <b><tt>{@link Ext.direct.Provider#id id}</tt></b> specified when the provider is
187 * {@link #addProvider added}.
188 * @param {String/Ext.data.Provider} id The id of the provider, or the provider instance.
190 getProvider : function(id){
191 return id.isProvider ? id : this.providers.get(id);
194 <span id='Ext-direct-Manager-method-removeProvider'> /**
195 </span> * Removes the provider.
196 * @param {String/Ext.direct.Provider} provider The provider instance or the id of the provider.
197 * @return {Ext.direct.Provider} The provider, null if not found.
199 removeProvider : function(provider){
201 providers = me.providers,
202 provider = provider.isProvider ? provider : providers.get(provider);
205 provider.un('data', me.onProviderData, me);
206 providers.remove(provider);
212 <span id='Ext-direct-Manager-method-addTransaction'> /**
213 </span> * Add a transaction to the manager.
215 * @param {Ext.direct.Transaction} transaction The transaction to add
216 * @return {Ext.direct.Transaction} transaction
218 addTransaction: function(transaction){
219 this.transactions.add(transaction);
223 <span id='Ext-direct-Manager-method-removeTransaction'> /**
224 </span> * Remove a transaction from the manager.
226 * @param {String/Ext.direct.Transaction} transaction The transaction/id of transaction to remove
227 * @return {Ext.direct.Transaction} transaction
229 removeTransaction: function(transaction){
230 transaction = this.getTransaction(transaction);
231 this.transactions.remove(transaction);
235 <span id='Ext-direct-Manager-method-getTransaction'> /**
236 </span> * Gets a transaction
238 * @param {String/Ext.direct.Transaction} transaction The transaction/id of transaction to get
239 * @return {Ext.direct.Transaction}
241 getTransaction: function(transaction){
242 return transaction.isTransaction ? transaction : this.transactions.get(transaction);
245 onProviderData : function(provider, event){
250 if (Ext.isArray(event)) {
251 for (len = event.length; i < len; ++i) {
252 me.onProviderData(provider, event[i]);
256 if (event.name && event.name != 'event' && event.name != 'exception') {
257 me.fireEvent(event.name, event);
258 } else if (event.type == 'exception') {
259 me.fireEvent('exception', event);
261 me.fireEvent('event', event, provider);
264 // Backwards compatibility
265 Ext.Direct = Ext.direct.Manager;