/** * @private */Ext.define('Ext.util.sizemonitor.Scroll', { extend: 'Ext.util.sizemonitor.Abstract', getElementConfig: function() { return { reference: 'detectorsContainer', classList: [Ext.baseCSSPrefix + 'size-monitors', 'scroll'], children: [ { reference: 'expandMonitor', className: 'expand' }, { reference: 'shrinkMonitor', className: 'shrink' } ] }; }, constructor: function(config) { this.onScroll = this.onScroll.bind(this); this.callParent(arguments); }, bindListeners: function(bind) { var method = bind ? 'addEventListener' : 'removeEventListener'; this.expandMonitor[method]('scroll', this.onScroll, true); this.shrinkMonitor[method]('scroll', this.onScroll, true); }, onScroll: function(e) { if (!this.destroyed) { // if the scroll value has been changed in refreshMonitor has been changed // then scroll event will be called for both expand and shrink monitors // but again calling the refresh will be unnecessary if (this.hasExpandMonitorScrollChanged && e.target === this.expandMonitor) { delete this.hasExpandMonitorScrollChanged; } else if (this.hasShrinkMonitorScrollChanged && e.target === this.shrinkMonitor) { delete this.hasShrinkMonitorScrollChanged; } else { Ext.TaskQueue.requestRead('refresh', this); } } }, refreshMonitors: function() { var expandMonitor = this.expandMonitor, shrinkMonitor = this.shrinkMonitor, end = 1000000; if (expandMonitor && !expandMonitor.destroyed) { // the performance improvement will only be appliable for IOS device if (Ext.isiOS) { this.hasExpandMonitorScrollChanged = true; } expandMonitor.scrollLeft = end; expandMonitor.scrollTop = end; } if (shrinkMonitor && !shrinkMonitor.destroyed) { if (Ext.isiOS) { this.hasShrinkMonitorScrollChanged = true; } shrinkMonitor.scrollLeft = end; shrinkMonitor.scrollTop = end; } }, destroy: function() { // This is a closure so Base destructor won't null it this.onScroll = null; this.callParent(); }});