本篇講解三個工具欄控件。其中Ext.toolbar.Toolbar可以用來放置一些工具類操控按鈕和菜單,Ext.toolbar.Paging專門用來控制數(shù)據(jù)集的分頁展示,Ext.ux.statusbar.StatusBar用來展示當前的狀態(tài)信息。
工具欄控件可以被附加在面板、窗口等容器類控件中,可以在四個方位添加多個工具欄控件。我們演示多個Ext.toolbar.Toolbar控件,然后附加到面板的不同位置。
我們這里借用上一篇所講到的listview控件作為數(shù)據(jù)展示,把listview放入一個面板控件中,然后把工具欄添加到面板頂部,并且在工具欄中實現(xiàn)數(shù)據(jù)集的服務端搜索的功能。
首先我們定義一個數(shù)據(jù)模型和Store:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | Ext.define( 'Datas' , { extend: 'Ext.data.Model' , fields: [ { name: 'IntData' , type: 'int' }, { name: 'StringData' , type: 'string' }, { name: 'TimeData' , type: 'date' } ], proxy: { type: 'ajax' , url: 'Toolbar1Json' , reader: { type: 'json' , root: 'rows' } } }); var store = new Ext.data.Store({ model: 'Datas' , sortInfo: { field: 'IntData' , direction: 'DESC' }, autoLoad: true }); store.load(); |
服務端的json輸出代碼:
[C# Mvc]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public JsonResult Toolbar1Json( string keyword) { var rows = BasicData.Table.Take(10).Select(x => new { IntData = x.IntData, StringData = x.StringData, TimeData = x.TimeData.ToShortDateString() }); if (! string .IsNullOrEmpty(keyword)) { rows = rows.Where(x => x.IntData.ToString() == keyword || x.StringData.Contains(keyword) || x.TimeData.Contains(keyword)); } var json = new { results = BasicData.Table.Count, rows = rows }; return Json(json, JsonRequestBehavior.AllowGet); } |
接著定義一個listView,來自上篇
現(xiàn)在我們要定義一個toolbar,在工具欄里面添加了工具按鈕、普通文字、分割線、和菜單,還實現(xiàn)了搜索的功能:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | var filed1 = new Ext.form.Field(); var tbar = Ext.create( "Ext.Toolbar" , { items: [ '文字' , "-" , { xtype: "splitbutton" , text: "按鈕" }, { text: "菜單" , menu: { items: [ { text: '選項1' }, { text: '選項2' }, { text: '選項3' , handler: function () { Ext.Msg.alert( "提示" , "來自菜單的消息" ); } } ] } }, "->" , "關(guān)鍵字:" , filed1, { text: "搜索" , handler: function () { store.load({ params: { keyword: filed1.getValue()} }); } } ] }); |
注意這里,我們通過load store,把keyword關(guān)鍵字傳給了c#的action參數(shù):
[Js]1 2 3 4 5 6 | { text: "搜索" , handler: function () { store.load({ params: { keyword: filed1.getValue()} }); } } |
最后我們定義一個Panel,把listView和toolbar都添加到Panel上,注意,tbar表示了這個工具欄在上方。
[Js]1 2 3 4 5 6 7 8 9 10 | var panel = new Ext.Panel({ renderTo: "div1" , width: 600, height: 250, collapsible: true , layout: 'fit' , title: '演示工具欄' , items: listView, tbar: tbar }); |
大功告成,我們來看看效果:
我們輸入關(guān)鍵字“6”后查看過濾效果:
如果工具欄上的item項目過多,而面板的長度不夠那會怎么樣?我們需要設置 overflowHandler: 'Menu',代碼如下:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var bbar = Ext.create( 'Ext.toolbar.Toolbar' , { layout: { overflowHandler: 'Menu' }, items: [ "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , "溢出測試" , { xtype: "button" , text: "溢出按鈕" , handler: function () { Ext.Msg.alert( "提示" , "工具欄按鈕被點擊" ); } }, { text: "溢出按鈕" , xtype: "splitbutton" }] }); |
預覽下效果:
現(xiàn)在我們要實現(xiàn)放置在右側(cè)的工具欄,這次我們直接在面板的代碼里面寫,代碼如下:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var panel = new Ext.Panel({ renderTo: "div1" , width: 600, height: 250, collapsible: true , layout: 'fit' , title: '演示工具欄' , items: listView, tbar: tbar, bbar: bbar, rbar: [{ iconCls: 'add16' , tooltip: '按鈕1' }, '-' , { iconCls: 'add16' , tooltip: { text: '按鈕2' , anchor: 'left' } }, { iconCls: 'add16' }, { iconCls: 'add16' }, '-' , { iconCls: 'add16' } ] }); |
預覽下效果:
最后奉上完整的代碼:
[Js]Ext.toolbar.Paging就是一個特殊的工具欄,它提供了數(shù)據(jù)集翻頁的功能,下面我們看看store的實現(xiàn):
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var store = Ext.create( 'Ext.data.Store' , { fields: [ 'IntData' , 'StringData' , 'TimeData' ], pageSize: 15, proxy: { type: 'ajax' , url: 'PagingToolbar1Json' , reader: { type: 'json' , root: 'rows' , totalProperty: 'results' } }, autoLoad: true }); |
對應的服務端mvc的代碼如下:
[C# Mvc]1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public JsonResult PagingToolbar1Json(int start, int limit) { var json = new { results = BasicData.Table.Count, rows = BasicData.Table.Skip(start).Take(limit).Select(x => new { IntData = x.IntData, StringData = x.StringData, TimeData = x.TimeData.ToShortDateString() }) }; return Json(json, JsonRequestBehavior.AllowGet); } |
現(xiàn)在我們借用上篇的Ext.view.View控件,把它放置到一個面板中,面板的代碼如下:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | var panel = Ext.create( 'Ext.Panel' , { renderTo: "div1" , frame: true , width: 535, autoHeight: true , collapsible: true , layout: 'fit' , title: '分頁控件用在View' , items: Ext.create( 'Ext.view.View' , { store: store, tpl: tpl, autoHeight: true , multiSelect: true , id: 'view1' , overItemCls: 'hover' , itemSelector: 'tr.data' , emptyText: '沒有數(shù)據(jù)' , plugins: [ Ext.create( 'Ext.ux.DataView.DragSelector' , {}), Ext.create( 'Ext.ux.DataView.LabelEditor' , { dataIndex: 'IntData' }) ] }), bbar: Ext.create( 'Ext.toolbar.Paging' , { store: store, displayInfo: true , items: [ '-' , { text: '第10頁' , handler: function () { store.loadPage(10); } }] }) }); |
注意上述代碼,我們在分頁工具欄控件中加入了一個按鈕,當單擊這個按鈕時,數(shù)據(jù)集自動翻到第十頁。
最后我們看看展示效果:
我們可以通過ux擴展支持定義不同風格的分頁控件,這效果就像三國殺擴展包一樣,我們可以通過滾軸控件和進度條控件去展示當前處于分頁項的哪個位置。我們在分頁控件的配置部分添加如下代碼:
[Js]1 | plugins: Ext.create( 'Ext.ux.SlidingPager' , {}) |
展示效果:
1 | plugins: Ext.create( 'Ext.ux.ProgressBarPager' , {}) |
展示效果:
完整的代碼:
[Js]這個狀態(tài)欄控件也是ext的一個擴展支持,不過它就好像軍爭包一樣,這次不是小小改進,而是一個全新的控件。
首先定義一個函數(shù),它在前2秒將狀態(tài)欄設置為繁忙狀態(tài),2秒后恢復:
[Js]1 2 3 4 5 6 7 8 9 10 11 12 | var loadFn = function (btn, statusBar) { btn = Ext.getCmp(btn); statusBar = Ext.getCmp(statusBar); btn.disable(); statusBar.showBusy(); Ext.defer( function () { statusBar.clearStatus({ useDefaults: true }); btn.enable(); }, 2000); }; |
接著我們將要幾個按鈕到狀態(tài)欄,第一個設置狀態(tài)為錯誤:
[Js]1 2 3 4 5 6 7 8 | handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.setStatus({ text: '錯誤!' , iconCls: 'x-status-error' , clear: true // 自動清除狀態(tài) }); } |
第二個設置狀態(tài)為加載中:
[Js]1 2 3 4 | handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.showBusy(); } |
第三個為清除狀態(tài):
[Js]1 2 3 4 | handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.clearStatus(); } |
展示效果,分別是加載、錯誤、和清除狀態(tài):
完整的代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | Ext.Loader.setConfig({ enabled: true }); Ext.Loader.setPath( 'Ext.ux' , '/ExtJs/ux' ); Ext.onReady( function () { var loadFn = function (btn, statusBar) { btn = Ext.getCmp(btn); statusBar = Ext.getCmp(statusBar); btn.disable(); statusBar.showBusy(); Ext.defer( function () { statusBar.clearStatus({ useDefaults: true }); btn.enable(); }, 2000); }; var panel = new Ext.Panel({ renderTo: "div1" , width: 600, height: 250, collapsible: true , //layout: 'fit', title: '演示狀態(tài)欄' , items: [{ xtype: "button" , text: "測試" , id: "button1" , handler: function (btn, statusBar) { loadFn( "button1" , "statusbar1" ); } }], bbar: Ext.create( 'Ext.ux.statusbar.StatusBar' , { id: 'statusbar1' , defaultText: '就緒' , text: '沒有任務' , iconCls: 'x-status-valid' , items: [ { xtype: 'button' , text: '設置狀態(tài)' , handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.setStatus({ text: '錯誤!' , iconCls: 'x-status-error' , clear: true // 自動清除狀態(tài) }); } }, { xtype: 'button' , text: '設置為加載狀態(tài)' , handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.showBusy(); } }, { xtype: 'button' , text: '清除狀態(tài)' , handler: function () { var sb = Ext.getCmp( 'statusbar1' ); sb.clearStatus(); } } ] }) }); }); |