UNPKG

extjs-gpl

Version:

GPL licensed version of Sencha Ext JS

195 lines (153 loc) 6.16 kB
Ext.define('KitchenSink.view.direct.GenericController', { extend: 'KitchenSink.view.direct.DirectVC', alias: 'controller.directgeneric', requires: [ 'Ext.direct.PollingProvider' ], config: { // This configuration is used to create Polling provider pollingCfg: { type: 'polling', url: 'data/direct/poll.php' }, listen: { // PollingProvider will fire `data` events that // Direct event domain will relay so that our // ViewController does not need to bind on the // Provider instance directly. direct: { '*': { data: 'onDirectEventData' } } } }, finishInit: function() { var me = this, options = {}; if (!me.finishInitReentry) { options.providerCfg = me.getPollingCfg(); // Work around reentrance me.finishInitReentry = true; me.requestUrl = options.providerCfg.url; // Synchronously request global Direct controller to add // polling provider with the specified configuration. me.fireEvent('directconnect', options); if (options.success) { me.onProviderInit(options.url, true); } } else { delete me.finishInitReentry; me.trulyFinishInit(); } }, trulyFinishInit: function() { var me = this, urls = me.providerUrls, options, provider, view, updateFn; provider = me.getProvider(urls[urls.length - 1]); // The Polling provider will post `data` events when something // is received from server side, and global Direct controller // will relay those events as `directeventdata`. However there // may be more than one Polling provider and we are only interested // in the events from "our" one, so we save its id to filter events. if (provider) { me.pollingProviderId = provider.id; // This may come early, before the view is rendered. // Also note that the provider is disconnected but not destroyed // when a view no longer needs it, so the polling interval set // previously will be reused. updateFn = function() { me.updateView('Polling interval set to ' + (provider.getInterval() / 1000) + ' seconds'); updateFn = null; }; view = me.getView(); if (view.rendered) { updateFn(); } else { view.on({ afterrender: updateFn, single: true }); } } }, updateView: function(content) { var view = this.getView(); view.update({ data: content }); view.getTargetEl().scroll('b', 100000, true); }, onFieldSpecialKey: function(field, event) { if (event.getKey() === event.ENTER) { this[field.directAction](field); } }, onButtonClick: function(button) { var field = this.lookupReference(button.fieldReference); this[field.directAction](field); }, setInterval: function(field) { var me = this, urls = me.providerUrls, interval, provider; interval = parseInt(field.getValue()); provider = me.getProvider(urls[urls.length - 1]); if (Ext.isNumeric(interval) && provider) { // Accidentally (or intentionally) setting the interval to 0 // will make the Polling provider to go frenzy and may cause // the browser to hang. So guard against it here. if (interval > 0) { if (!provider.isConnected()) { provider.connect(); } provider.setInterval(interval * 1000); me.updateView('Polling interval set to ' + interval + ' seconds'); } else { provider.disconnect(); me.updateView('Polling was paused'); } } }, doEcho: function(field) { TestAction.doEcho(field.getValue(), this.onEcho, this, { field: field }); }, onEcho: function(result, event, success, options) { var transaction, content; transaction = event.getTransaction(); content = Ext.String.format( '<b>Successful call to {0}.{1} with response:</b> <pre>{2}</pre>', transaction.action, transaction.method, Ext.encode(result) ); this.updateView(content); options.field.reset(); }, doMultiply: function(field) { TestAction.multiply(field.getValue(), this.onMultiply, this, { field: field }); }, onMultiply: function(result, event, success, options) { var transaction, content; transaction = event.getTransaction(); if (event.status) { content = Ext.String.format( '<b>Successful call to {0}.{1} with response:</b><pre>{2}</pre>', transaction.action, transaction.method, Ext.encode(result) ); } else { content = Ext.String.format( '<b>Call to {0}.{1} failed with message:</b><pre>{2}</pre>', transaction.action, transaction.method, event.message ); } this.updateView(content); options.field.reset(); }, onDirectEventData: function(provider, event) { if (provider.id === this.pollingProviderId) { this.updateView('<i>' + event.data + '</i>'); } } });