ExtJS
ExtJS vs jQuery
ExtJS:フレームワーク
jQuery:ライブラリ
※対象:ExtJS 3.x
<link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
<script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="extjs/ext-all.js"></script>
Model:クライアントのデータ構造
Proxy:サーバと通信
Store:サーバから取得したデータを処理
★グリッド1
●グリッド定義
var grid = new Ext.grid.GridPanel({
id: 'gridID',
title: 'XXX一覧',
store : new Ext.data.Store(), 書き方1
//ds: new Ext.xxx.JsonStore(), 書き方2
enableHdMenu: true,
loadMask: true,
viewConfig:{
getRowClass: function(record, rIndex, rParams, store){
var colName = record.get('col3');
if(colName === 'XXX'){
//特定行を設定する
rParams.tstyle += "background-color:grey;";
}
}
},
tbar:[{
text: '作成',
id: 'button1',
handler:function(){
// Do Something
}
},{
text: '編集',
disabled: true,
hidden: true,
id: 'button2',
handler:function(){
// Do Something
}
}],
region :'center',
margins :'0 5 0 5',
columns: [{
header: 'カラム1',
width: 100, sortable: true, dataIndex: 'col1'
},{
header: 'カラム2',
width: 200, sortable: true, dataIndex: 'col2'
},{
header: 'カラム3',
width: 150, sortable: true, dataIndex: 'col3'
}],
stripeRows: true //行ごとに背景色を変える
});
//行選択イベント
grid.on(
'click',
function(e){
// Do Something
}
);
grid.on(
'keypress',
function(e){
// Do Something
}
);
//ダブルクリックイベント
grid.on(
'rowdblclick',
function(e){
// Do Something
}
);
// グリッドで既定値はセル単位の選択となる
var grid = new Ext.grid.EditorGridPanel({
selModel:new Ext.grid.RowSelectionModel, // 行単位の選択
...
});
※Ctrlを押したまま、複数行が選択可能
★Ext.grid.CheckboxSelectionModel
var sm = grid.getSelectionModel();
sm.selectAll();
sm.selectFirstRow();
sm.selectLastRow([flag]); // flag:trueの場合にチェック済みを保持
sm.selectNext();
sm.selectPrevious();
sm.selectRange(tartRow,ndRow, [Boolean keepExisting]);
sm.selectRow(row);
sm.selectRows(rows); // [1,3,5]
sm.clearSelections();
sm.deselectRange(startRow, endRow);
sm.deselectRow(row);
var data = sm.getSelections();
★コンポボックス
var combo = new Ext.form.ComboBox(...);
//先頭の値を設定
combo.setValue(combo.getStore().getAt(0).get('xxx'));
●リスナー
書き方1
var combo = new Ext.form.ComboBox({
id: 'comboID',
store: new Ext.data.ArrayStore({
fields: [
'ID','NAME'
],
data: [
['0', 'AAA'],['1', 'BBB']
]
}),
valueField: 'ID',
displayField: 'NAME',
autoWidth: true,
listeners: {
select : function( combo, record, index ) {
...
}
}
});
書き方2
var listener = function(){
...
};
combo.on('select', listener);
★サーバと通信
・Ext.Ajax.request JSON/HTML
・Ext.tree.TreeLoader JSON
・Ext.data.Store/XXXStore JSON/XML
・Ext.Element.update HTML
サンプル
Ext.Ajax.request({
url: '/xxx/yyy',
params: { id: 101, name: 'Andy' },
jsonData: { data1: xxx, data2: xxx },
method: 'POST',
timeout: 3000,
async: false,
headers: { "Content-Type": 'application/json; charset=utf-8' },
success: function (response, options) {
var result = Ext.decode(response.responseText);
if (result) {
// do something
}else {
Ext.MessageBox.alert('Error', result.msg);
}
},
failure: function (response, options) {
Ext.MessageBox.alert('Error', response.msg);
}
});
「Ext.data.JsonStore」=「Ext.data.Store」+「Ext.data.HttpProxy」+「Ext.data.JsonReader」
var store = new Ext.data.JsonStore({
url: './xxx/data.json',
root: 'row',
totalProperty: 'totalCount',
fields: [
{ name:'name' },
{ name:'gender' },
{ name:'tel' },
{ name:'mail' },
{ name:'info' }
]
});
store.load();
「Ext.data.XmlStore」=「Ext.data.Store」+「Ext.data.HttpProxy」+「Ext.data.XmlReader」
var store = new Ext.data.XmlStore({
url: './xxx/data.xml',
record: 'row',
totalRecords: 'totalCount',
fields: [
{ name:'name' },
{ name:'gender' },
{ name:'tel' },
{ name:'mail' },
{ name:'info' }
]
});
store.load();
★グリッド2
●データ作成
var store = new Ext.data.JsonStore({
autoDestroy: true,
root: 'row',
fields: [
{name: 'col1'},
{name: 'col2'},
{name: 'col3'}
],
url: '/commons/getJson'
});
//サーバへ引数
var params = {
ID: "101",
Name: "Tester"
};
//データストアにデータ読込
store.load({
params: params,
callback: function(records, options, success) {
if(success){
var record = records[0];
if(record) {
var info = record.store.reader.jsonData['info'];
// Do Something
store.getCount(); // OK
store.getTotalCount(); // OK
// 再ロード
store.reload();
}
}
}
});
store.getCount(); // NG 非同期処理なので、取得できない
store.getTotalCount(); // NG
//グリッドにデータセット
var grid = Ext.getCmp('gridID');
grid.reconfigure(store, grid.colModel);
//クリア
var store = new Ext.data.ArrayStore();
grid.reconfigure(store, grid.colModel);
●フィルターを設定
var filter = function(record) {
var combbox = Ext.getCmp('combboxID');
var value = combbox.getValue();
return record.get('ID') === value;
};
var grid = Ext.getCmp('gridID');
var store = grid.getStore();
//方法1
store.filter({
fn: filter,
scope: this
});
//リロード後でもフィルターも有効になる
var onStoreLoad = function(store, records, options){
//方法2
store.filterBy(filter);
};
store.on("load", onStoreLoad);
store.reload();
●データセットを取得する方法
方法1
var store = new Ext.data.JsonStore({
...
});
var grid = new Ext.grid.GridPanel({
store : new Ext.data.Store(),
...
});
grid.reconfigure(store, grid.colModel);
方法2
var store = new Ext.data.JsonStore({
...
});
store.load();
var grid = new Ext.grid.GridPanel({
store : store,
...
});
JSONデータ
({
"totalCount":"2",
"info":"dummy",
"row":
[{
"COL_1":"a",
"COL_2":"b",
"COL_3":"c"
},{
"COL_1":"d",
"COL_2":"e",
"COL_3":"f"
}]
})
★メッセージ
Ext.Msg.show({
title: 'サンプル',
msg: '失敗しました。',
buttons: Ext.Msg.OK,
icon: Ext.MessageBox.ERROR
});
Ext.Msg.show({
title: 'サンプル',
msg: 'よろしいでしょうか?',
buttons: Ext.Msg.OKCANCEL,
icon: Ext.MessageBox.INFO,
fn : function(btn, text) {
if ( btn == 'ok' ) {
// do something
}
}
});
★ダイアログ
var grid = new Ext.grid.GridPanel({
// do something
});
var panel = new Ext.Panel({
// do something
});
var win = new Ext.Window({
title: 'Sample',
width: 200,
height: 400,
layout : 'border',
modal: true,
items: [grid, panel],
listeners: {
afterlayout: function(){ //show後
// do something
}
},
buttons: [{
text: '確定',
handler: function(){
// do something
}
},{
text: 'キャンセル',
handler: function(){
win.close();
}
}]
});
win.show();
★Ext.getとExt.fly
・Ext.get Cacheにより再利用
・Ext.fly 一回だけ メモリ消費小
var el1 = Ext.get('id'); // ID
var el2 = Ext.get(el1); // Ext.Element
var el3 = Ext.get(el1.dom); // HTMLElement
※flyも同様
Ext.fly('id').removeClass('error');
Ext.fly('id').hide();
★Arrayに関連するAPI
var idx = [1, 2, 3, 4, 5].indexOf(3); //2
var arr = [1, 2, 3, 4];
arr.remove(2);
var len = arr.length; //3
Ext.each([1, 2, 3, 4, 5], function(num){
console.log(num);
});
★Stringに関連するAPI
var str = String.format('{0}:{1}', '名前', 'Andy');
var str = String.leftPad('123', 5, '0'); //00123
var params = {
name: 'Andy',
age: 23
};
var str = Ext.encode(params); // {"name":"Andy","age":23}
var str = Ext.urlEncode(params); // name=Andy&age=23
var str = '{"name":"Andy","age":23}';
var obj = Ext.decode(str);
console.log(obj.name); // Andy
var str = 'name=Andy&age=23';
var obj = Ext.urlDecode(str);
console.log(obj.age); // 23