1 | /*! |
---|
2 | * Ext JS Library 3.4.0 |
---|
3 | * Copyright(c) 2006-2011 Sencha Inc. |
---|
4 | * licensing@sencha.com |
---|
5 | * http://www.sencha.com/license |
---|
6 | */ |
---|
7 | /** |
---|
8 | * @class Ext.PagingToolbar |
---|
9 | * @extends Ext.Toolbar |
---|
10 | * <p>As the amount of records increases, the time required for the browser to render |
---|
11 | * them increases. Paging is used to reduce the amount of data exchanged with the client. |
---|
12 | * Note: if there are more records/rows than can be viewed in the available screen area, vertical |
---|
13 | * scrollbars will be added.</p> |
---|
14 | * <p>Paging is typically handled on the server side (see exception below). The client sends |
---|
15 | * parameters to the server side, which the server needs to interpret and then respond with the |
---|
16 | * approprate data.</p> |
---|
17 | * <p><b>Ext.PagingToolbar</b> is a specialized toolbar that is bound to a {@link Ext.data.Store} |
---|
18 | * and provides automatic paging control. This Component {@link Ext.data.Store#load load}s blocks |
---|
19 | * of data into the <tt>{@link #store}</tt> by passing {@link Ext.data.Store#paramNames paramNames} used for |
---|
20 | * paging criteria.</p> |
---|
21 | * <p>PagingToolbar is typically used as one of the Grid's toolbars:</p> |
---|
22 | * <pre><code> |
---|
23 | Ext.QuickTips.init(); // to display button quicktips |
---|
24 | |
---|
25 | var myStore = new Ext.data.Store({ |
---|
26 | reader: new Ext.data.JsonReader({ |
---|
27 | {@link Ext.data.JsonReader#totalProperty totalProperty}: 'results', |
---|
28 | ... |
---|
29 | }), |
---|
30 | ... |
---|
31 | }); |
---|
32 | |
---|
33 | var myPageSize = 25; // server script should only send back 25 items at a time |
---|
34 | |
---|
35 | var grid = new Ext.grid.GridPanel({ |
---|
36 | ... |
---|
37 | store: myStore, |
---|
38 | bbar: new Ext.PagingToolbar({ |
---|
39 | {@link #store}: myStore, // grid and PagingToolbar using same store |
---|
40 | {@link #displayInfo}: true, |
---|
41 | {@link #pageSize}: myPageSize, |
---|
42 | {@link #prependButtons}: true, |
---|
43 | items: [ |
---|
44 | 'text 1' |
---|
45 | ] |
---|
46 | }) |
---|
47 | }); |
---|
48 | * </code></pre> |
---|
49 | * |
---|
50 | * <p>To use paging, pass the paging requirements to the server when the store is first loaded.</p> |
---|
51 | * <pre><code> |
---|
52 | store.load({ |
---|
53 | params: { |
---|
54 | // specify params for the first page load if using paging |
---|
55 | start: 0, |
---|
56 | limit: myPageSize, |
---|
57 | // other params |
---|
58 | foo: 'bar' |
---|
59 | } |
---|
60 | }); |
---|
61 | * </code></pre> |
---|
62 | * |
---|
63 | * <p>If using {@link Ext.data.Store#autoLoad store's autoLoad} configuration:</p> |
---|
64 | * <pre><code> |
---|
65 | var myStore = new Ext.data.Store({ |
---|
66 | {@link Ext.data.Store#autoLoad autoLoad}: {params:{start: 0, limit: 25}}, |
---|
67 | ... |
---|
68 | }); |
---|
69 | * </code></pre> |
---|
70 | * |
---|
71 | * <p>The packet sent back from the server would have this form:</p> |
---|
72 | * <pre><code> |
---|
73 | { |
---|
74 | "success": true, |
---|
75 | "results": 2000, |
---|
76 | "rows": [ // <b>*Note:</b> this must be an Array |
---|
77 | { "id": 1, "name": "Bill", "occupation": "Gardener" }, |
---|
78 | { "id": 2, "name": "Ben", "occupation": "Horticulturalist" }, |
---|
79 | ... |
---|
80 | { "id": 25, "name": "Sue", "occupation": "Botanist" } |
---|
81 | ] |
---|
82 | } |
---|
83 | * </code></pre> |
---|
84 | * <p><u>Paging with Local Data</u></p> |
---|
85 | * <p>Paging can also be accomplished with local data using extensions:</p> |
---|
86 | * <div class="mdetail-params"><ul> |
---|
87 | * <li><a href="http://extjs.com/forum/showthread.php?t=71532">Ext.ux.data.PagingStore</a></li> |
---|
88 | * <li>Paging Memory Proxy (examples/ux/PagingMemoryProxy.js)</li> |
---|
89 | * </ul></div> |
---|
90 | * @constructor Create a new PagingToolbar |
---|
91 | * @param {Object} config The config object |
---|
92 | * @xtype paging |
---|
93 | */ |
---|
94 | (function() { |
---|
95 | |
---|
96 | var T = Ext.Toolbar; |
---|
97 | |
---|
98 | Ext.PagingToolbar = Ext.extend(Ext.Toolbar, { |
---|
99 | /** |
---|
100 | * @cfg {Ext.data.Store} store |
---|
101 | * The {@link Ext.data.Store} the paging toolbar should use as its data source (required). |
---|
102 | */ |
---|
103 | /** |
---|
104 | * @cfg {Boolean} displayInfo |
---|
105 | * <tt>true</tt> to display the displayMsg (defaults to <tt>false</tt>) |
---|
106 | */ |
---|
107 | /** |
---|
108 | * @cfg {Number} pageSize |
---|
109 | * The number of records to display per page (defaults to <tt>20</tt>) |
---|
110 | */ |
---|
111 | pageSize : 20, |
---|
112 | /** |
---|
113 | * @cfg {Boolean} prependButtons |
---|
114 | * <tt>true</tt> to insert any configured <tt>items</tt> <i>before</i> the paging buttons. |
---|
115 | * Defaults to <tt>false</tt>. |
---|
116 | */ |
---|
117 | /** |
---|
118 | * @cfg {String} displayMsg |
---|
119 | * The paging status message to display (defaults to <tt>'Displaying {0} - {1} of {2}'</tt>). |
---|
120 | * Note that this string is formatted using the braced numbers <tt>{0}-{2}</tt> as tokens |
---|
121 | * that are replaced by the values for start, end and total respectively. These tokens should |
---|
122 | * be preserved when overriding this string if showing those values is desired. |
---|
123 | */ |
---|
124 | displayMsg : 'Displaying {0} - {1} of {2}', |
---|
125 | /** |
---|
126 | * @cfg {String} emptyMsg |
---|
127 | * The message to display when no records are found (defaults to 'No data to display') |
---|
128 | */ |
---|
129 | emptyMsg : 'No data to display', |
---|
130 | /** |
---|
131 | * @cfg {String} beforePageText |
---|
132 | * The text displayed before the input item (defaults to <tt>'Page'</tt>). |
---|
133 | */ |
---|
134 | beforePageText : 'Page', |
---|
135 | /** |
---|
136 | * @cfg {String} afterPageText |
---|
137 | * Customizable piece of the default paging text (defaults to <tt>'of {0}'</tt>). Note that |
---|
138 | * this string is formatted using <tt>{0}</tt> as a token that is replaced by the number of |
---|
139 | * total pages. This token should be preserved when overriding this string if showing the |
---|
140 | * total page count is desired. |
---|
141 | */ |
---|
142 | afterPageText : 'of {0}', |
---|
143 | /** |
---|
144 | * @cfg {String} firstText |
---|
145 | * The quicktip text displayed for the first page button (defaults to <tt>'First Page'</tt>). |
---|
146 | * <b>Note</b>: quick tips must be initialized for the quicktip to show. |
---|
147 | */ |
---|
148 | firstText : 'First Page', |
---|
149 | /** |
---|
150 | * @cfg {String} prevText |
---|
151 | * The quicktip text displayed for the previous page button (defaults to <tt>'Previous Page'</tt>). |
---|
152 | * <b>Note</b>: quick tips must be initialized for the quicktip to show. |
---|
153 | */ |
---|
154 | prevText : 'Previous Page', |
---|
155 | /** |
---|
156 | * @cfg {String} nextText |
---|
157 | * The quicktip text displayed for the next page button (defaults to <tt>'Next Page'</tt>). |
---|
158 | * <b>Note</b>: quick tips must be initialized for the quicktip to show. |
---|
159 | */ |
---|
160 | nextText : 'Next Page', |
---|
161 | /** |
---|
162 | * @cfg {String} lastText |
---|
163 | * The quicktip text displayed for the last page button (defaults to <tt>'Last Page'</tt>). |
---|
164 | * <b>Note</b>: quick tips must be initialized for the quicktip to show. |
---|
165 | */ |
---|
166 | lastText : 'Last Page', |
---|
167 | /** |
---|
168 | * @cfg {String} refreshText |
---|
169 | * The quicktip text displayed for the Refresh button (defaults to <tt>'Refresh'</tt>). |
---|
170 | * <b>Note</b>: quick tips must be initialized for the quicktip to show. |
---|
171 | */ |
---|
172 | refreshText : 'Refresh', |
---|
173 | |
---|
174 | /** |
---|
175 | * <p><b>Deprecated</b>. <code>paramNames</code> should be set in the <b>data store</b> |
---|
176 | * (see {@link Ext.data.Store#paramNames}).</p> |
---|
177 | * <br><p>Object mapping of parameter names used for load calls, initially set to:</p> |
---|
178 | * <pre>{start: 'start', limit: 'limit'}</pre> |
---|
179 | * @type Object |
---|
180 | * @property paramNames |
---|
181 | * @deprecated |
---|
182 | */ |
---|
183 | |
---|
184 | /** |
---|
185 | * The number of records to display per page. See also <tt>{@link #cursor}</tt>. |
---|
186 | * @type Number |
---|
187 | * @property pageSize |
---|
188 | */ |
---|
189 | |
---|
190 | /** |
---|
191 | * Indicator for the record position. This property might be used to get the active page |
---|
192 | * number for example:<pre><code> |
---|
193 | * // t is reference to the paging toolbar instance |
---|
194 | * var activePage = Math.ceil((t.cursor + t.pageSize) / t.pageSize); |
---|
195 | * </code></pre> |
---|
196 | * @type Number |
---|
197 | * @property cursor |
---|
198 | */ |
---|
199 | |
---|
200 | initComponent : function(){ |
---|
201 | var pagingItems = [this.first = new T.Button({ |
---|
202 | tooltip: this.firstText, |
---|
203 | overflowText: this.firstText, |
---|
204 | iconCls: 'x-tbar-page-first', |
---|
205 | disabled: true, |
---|
206 | handler: this.moveFirst, |
---|
207 | scope: this |
---|
208 | }), this.prev = new T.Button({ |
---|
209 | tooltip: this.prevText, |
---|
210 | overflowText: this.prevText, |
---|
211 | iconCls: 'x-tbar-page-prev', |
---|
212 | disabled: true, |
---|
213 | handler: this.movePrevious, |
---|
214 | scope: this |
---|
215 | }), '-', this.beforePageText, |
---|
216 | this.inputItem = new Ext.form.NumberField({ |
---|
217 | cls: 'x-tbar-page-number', |
---|
218 | allowDecimals: false, |
---|
219 | allowNegative: false, |
---|
220 | enableKeyEvents: true, |
---|
221 | selectOnFocus: true, |
---|
222 | submitValue: false, |
---|
223 | listeners: { |
---|
224 | scope: this, |
---|
225 | keydown: this.onPagingKeyDown, |
---|
226 | blur: this.onPagingBlur |
---|
227 | } |
---|
228 | }), this.afterTextItem = new T.TextItem({ |
---|
229 | text: String.format(this.afterPageText, 1) |
---|
230 | }), '-', this.next = new T.Button({ |
---|
231 | tooltip: this.nextText, |
---|
232 | overflowText: this.nextText, |
---|
233 | iconCls: 'x-tbar-page-next', |
---|
234 | disabled: true, |
---|
235 | handler: this.moveNext, |
---|
236 | scope: this |
---|
237 | }), this.last = new T.Button({ |
---|
238 | tooltip: this.lastText, |
---|
239 | overflowText: this.lastText, |
---|
240 | iconCls: 'x-tbar-page-last', |
---|
241 | disabled: true, |
---|
242 | handler: this.moveLast, |
---|
243 | scope: this |
---|
244 | }), '-', this.refresh = new T.Button({ |
---|
245 | tooltip: this.refreshText, |
---|
246 | overflowText: this.refreshText, |
---|
247 | iconCls: 'x-tbar-loading', |
---|
248 | handler: this.doRefresh, |
---|
249 | scope: this |
---|
250 | })]; |
---|
251 | |
---|
252 | |
---|
253 | var userItems = this.items || this.buttons || []; |
---|
254 | if (this.prependButtons) { |
---|
255 | this.items = userItems.concat(pagingItems); |
---|
256 | }else{ |
---|
257 | this.items = pagingItems.concat(userItems); |
---|
258 | } |
---|
259 | delete this.buttons; |
---|
260 | if(this.displayInfo){ |
---|
261 | this.items.push('->'); |
---|
262 | this.items.push(this.displayItem = new T.TextItem({})); |
---|
263 | } |
---|
264 | Ext.PagingToolbar.superclass.initComponent.call(this); |
---|
265 | this.addEvents( |
---|
266 | /** |
---|
267 | * @event change |
---|
268 | * Fires after the active page has been changed. |
---|
269 | * @param {Ext.PagingToolbar} this |
---|
270 | * @param {Object} pageData An object that has these properties:<ul> |
---|
271 | * <li><code>total</code> : Number <div class="sub-desc">The total number of records in the dataset as |
---|
272 | * returned by the server</div></li> |
---|
273 | * <li><code>activePage</code> : Number <div class="sub-desc">The current page number</div></li> |
---|
274 | * <li><code>pages</code> : Number <div class="sub-desc">The total number of pages (calculated from |
---|
275 | * the total number of records in the dataset as returned by the server and the current {@link #pageSize})</div></li> |
---|
276 | * </ul> |
---|
277 | */ |
---|
278 | 'change', |
---|
279 | /** |
---|
280 | * @event beforechange |
---|
281 | * Fires just before the active page is changed. |
---|
282 | * Return false to prevent the active page from being changed. |
---|
283 | * @param {Ext.PagingToolbar} this |
---|
284 | * @param {Object} params An object hash of the parameters which the PagingToolbar will send when |
---|
285 | * loading the required page. This will contain:<ul> |
---|
286 | * <li><code>start</code> : Number <div class="sub-desc">The starting row number for the next page of records to |
---|
287 | * be retrieved from the server</div></li> |
---|
288 | * <li><code>limit</code> : Number <div class="sub-desc">The number of records to be retrieved from the server</div></li> |
---|
289 | * </ul> |
---|
290 | * <p>(note: the names of the <b>start</b> and <b>limit</b> properties are determined |
---|
291 | * by the store's {@link Ext.data.Store#paramNames paramNames} property.)</p> |
---|
292 | * <p>Parameters may be added as required in the event handler.</p> |
---|
293 | */ |
---|
294 | 'beforechange' |
---|
295 | ); |
---|
296 | this.on('afterlayout', this.onFirstLayout, this, {single: true}); |
---|
297 | this.cursor = 0; |
---|
298 | this.bindStore(this.store, true); |
---|
299 | }, |
---|
300 | |
---|
301 | // private |
---|
302 | onFirstLayout : function(){ |
---|
303 | if(this.dsLoaded){ |
---|
304 | this.onLoad.apply(this, this.dsLoaded); |
---|
305 | } |
---|
306 | }, |
---|
307 | |
---|
308 | // private |
---|
309 | updateInfo : function(){ |
---|
310 | if(this.displayItem){ |
---|
311 | var count = this.store.getCount(); |
---|
312 | var msg = count == 0 ? |
---|
313 | this.emptyMsg : |
---|
314 | String.format( |
---|
315 | this.displayMsg, |
---|
316 | this.cursor+1, this.cursor+count, this.store.getTotalCount() |
---|
317 | ); |
---|
318 | this.displayItem.setText(msg); |
---|
319 | } |
---|
320 | }, |
---|
321 | |
---|
322 | // private |
---|
323 | onLoad : function(store, r, o){ |
---|
324 | if(!this.rendered){ |
---|
325 | this.dsLoaded = [store, r, o]; |
---|
326 | return; |
---|
327 | } |
---|
328 | var p = this.getParams(); |
---|
329 | this.cursor = (o.params && o.params[p.start]) ? o.params[p.start] : 0; |
---|
330 | var d = this.getPageData(), ap = d.activePage, ps = d.pages; |
---|
331 | |
---|
332 | this.afterTextItem.setText(String.format(this.afterPageText, d.pages)); |
---|
333 | this.inputItem.setValue(ap); |
---|
334 | this.first.setDisabled(ap == 1); |
---|
335 | this.prev.setDisabled(ap == 1); |
---|
336 | this.next.setDisabled(ap == ps); |
---|
337 | this.last.setDisabled(ap == ps); |
---|
338 | this.refresh.enable(); |
---|
339 | this.updateInfo(); |
---|
340 | this.fireEvent('change', this, d); |
---|
341 | }, |
---|
342 | |
---|
343 | // private |
---|
344 | getPageData : function(){ |
---|
345 | var total = this.store.getTotalCount(); |
---|
346 | return { |
---|
347 | total : total, |
---|
348 | activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize), |
---|
349 | pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize) |
---|
350 | }; |
---|
351 | }, |
---|
352 | |
---|
353 | /** |
---|
354 | * Change the active page |
---|
355 | * @param {Integer} page The page to display |
---|
356 | */ |
---|
357 | changePage : function(page){ |
---|
358 | this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount())); |
---|
359 | }, |
---|
360 | |
---|
361 | // private |
---|
362 | onLoadError : function(){ |
---|
363 | if(!this.rendered){ |
---|
364 | return; |
---|
365 | } |
---|
366 | this.refresh.enable(); |
---|
367 | }, |
---|
368 | |
---|
369 | // private |
---|
370 | readPage : function(d){ |
---|
371 | var v = this.inputItem.getValue(), pageNum; |
---|
372 | if (!v || isNaN(pageNum = parseInt(v, 10))) { |
---|
373 | this.inputItem.setValue(d.activePage); |
---|
374 | return false; |
---|
375 | } |
---|
376 | return pageNum; |
---|
377 | }, |
---|
378 | |
---|
379 | onPagingFocus : function(){ |
---|
380 | this.inputItem.select(); |
---|
381 | }, |
---|
382 | |
---|
383 | //private |
---|
384 | onPagingBlur : function(e){ |
---|
385 | this.inputItem.setValue(this.getPageData().activePage); |
---|
386 | }, |
---|
387 | |
---|
388 | // private |
---|
389 | onPagingKeyDown : function(field, e){ |
---|
390 | var k = e.getKey(), d = this.getPageData(), pageNum; |
---|
391 | if (k == e.RETURN) { |
---|
392 | e.stopEvent(); |
---|
393 | pageNum = this.readPage(d); |
---|
394 | if(pageNum !== false){ |
---|
395 | pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1; |
---|
396 | this.doLoad(pageNum * this.pageSize); |
---|
397 | } |
---|
398 | }else if (k == e.HOME || k == e.END){ |
---|
399 | e.stopEvent(); |
---|
400 | pageNum = k == e.HOME ? 1 : d.pages; |
---|
401 | field.setValue(pageNum); |
---|
402 | }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){ |
---|
403 | e.stopEvent(); |
---|
404 | if((pageNum = this.readPage(d))){ |
---|
405 | var increment = e.shiftKey ? 10 : 1; |
---|
406 | if(k == e.DOWN || k == e.PAGEDOWN){ |
---|
407 | increment *= -1; |
---|
408 | } |
---|
409 | pageNum += increment; |
---|
410 | if(pageNum >= 1 & pageNum <= d.pages){ |
---|
411 | field.setValue(pageNum); |
---|
412 | } |
---|
413 | } |
---|
414 | } |
---|
415 | }, |
---|
416 | |
---|
417 | // private |
---|
418 | getParams : function(){ |
---|
419 | //retain backwards compat, allow params on the toolbar itself, if they exist. |
---|
420 | return this.paramNames || this.store.paramNames; |
---|
421 | }, |
---|
422 | |
---|
423 | // private |
---|
424 | beforeLoad : function(){ |
---|
425 | if(this.rendered && this.refresh){ |
---|
426 | this.refresh.disable(); |
---|
427 | } |
---|
428 | }, |
---|
429 | |
---|
430 | // private |
---|
431 | doLoad : function(start){ |
---|
432 | var o = {}, pn = this.getParams(); |
---|
433 | o[pn.start] = start; |
---|
434 | o[pn.limit] = this.pageSize; |
---|
435 | if(this.fireEvent('beforechange', this, o) !== false){ |
---|
436 | this.store.load({params:o}); |
---|
437 | } |
---|
438 | }, |
---|
439 | |
---|
440 | /** |
---|
441 | * Move to the first page, has the same effect as clicking the 'first' button. |
---|
442 | */ |
---|
443 | moveFirst : function(){ |
---|
444 | this.doLoad(0); |
---|
445 | }, |
---|
446 | |
---|
447 | /** |
---|
448 | * Move to the previous page, has the same effect as clicking the 'previous' button. |
---|
449 | */ |
---|
450 | movePrevious : function(){ |
---|
451 | this.doLoad(Math.max(0, this.cursor-this.pageSize)); |
---|
452 | }, |
---|
453 | |
---|
454 | /** |
---|
455 | * Move to the next page, has the same effect as clicking the 'next' button. |
---|
456 | */ |
---|
457 | moveNext : function(){ |
---|
458 | this.doLoad(this.cursor+this.pageSize); |
---|
459 | }, |
---|
460 | |
---|
461 | /** |
---|
462 | * Move to the last page, has the same effect as clicking the 'last' button. |
---|
463 | */ |
---|
464 | moveLast : function(){ |
---|
465 | var total = this.store.getTotalCount(), |
---|
466 | extra = total % this.pageSize; |
---|
467 | |
---|
468 | this.doLoad(extra ? (total - extra) : total - this.pageSize); |
---|
469 | }, |
---|
470 | |
---|
471 | /** |
---|
472 | * Refresh the current page, has the same effect as clicking the 'refresh' button. |
---|
473 | */ |
---|
474 | doRefresh : function(){ |
---|
475 | this.doLoad(this.cursor); |
---|
476 | }, |
---|
477 | |
---|
478 | /** |
---|
479 | * Binds the paging toolbar to the specified {@link Ext.data.Store} |
---|
480 | * @param {Store} store The store to bind to this toolbar |
---|
481 | * @param {Boolean} initial (Optional) true to not remove listeners |
---|
482 | */ |
---|
483 | bindStore : function(store, initial){ |
---|
484 | var doLoad; |
---|
485 | if(!initial && this.store){ |
---|
486 | if(store !== this.store && this.store.autoDestroy){ |
---|
487 | this.store.destroy(); |
---|
488 | }else{ |
---|
489 | this.store.un('beforeload', this.beforeLoad, this); |
---|
490 | this.store.un('load', this.onLoad, this); |
---|
491 | this.store.un('exception', this.onLoadError, this); |
---|
492 | } |
---|
493 | if(!store){ |
---|
494 | this.store = null; |
---|
495 | } |
---|
496 | } |
---|
497 | if(store){ |
---|
498 | store = Ext.StoreMgr.lookup(store); |
---|
499 | store.on({ |
---|
500 | scope: this, |
---|
501 | beforeload: this.beforeLoad, |
---|
502 | load: this.onLoad, |
---|
503 | exception: this.onLoadError |
---|
504 | }); |
---|
505 | doLoad = true; |
---|
506 | } |
---|
507 | this.store = store; |
---|
508 | if(doLoad){ |
---|
509 | this.onLoad(store, null, {}); |
---|
510 | } |
---|
511 | }, |
---|
512 | |
---|
513 | /** |
---|
514 | * Unbinds the paging toolbar from the specified {@link Ext.data.Store} <b>(deprecated)</b> |
---|
515 | * @param {Ext.data.Store} store The data store to unbind |
---|
516 | */ |
---|
517 | unbind : function(store){ |
---|
518 | this.bindStore(null); |
---|
519 | }, |
---|
520 | |
---|
521 | /** |
---|
522 | * Binds the paging toolbar to the specified {@link Ext.data.Store} <b>(deprecated)</b> |
---|
523 | * @param {Ext.data.Store} store The data store to bind |
---|
524 | */ |
---|
525 | bind : function(store){ |
---|
526 | this.bindStore(store); |
---|
527 | }, |
---|
528 | |
---|
529 | // private |
---|
530 | onDestroy : function(){ |
---|
531 | this.bindStore(null); |
---|
532 | Ext.PagingToolbar.superclass.onDestroy.call(this); |
---|
533 | } |
---|
534 | }); |
---|
535 | |
---|
536 | })(); |
---|
537 | Ext.reg('paging', Ext.PagingToolbar); |
---|