sencha -sdk ~/mylib/touch/touch-2.3.1 generate app App .
sencha web -port 8080 start -map ./
Ext.define('App.view.Main', {
extend: 'Ext.Container',
xtype: 'app-main',
config: {
items: [{
xtype: 'toolbar',
items: [{
xtype: 'button',
text: 'Button1'
},{
xtype: 'button',
text: 'Button2'
}]
},{
xtype : 'panel',
html: '<h1>My Panel</h1>'
}]
}
});
Ext.define('App.model.Note', {
extend: 'Ext.data.Model',
config: {
fields: [
{
name: 'id',
type: 'string'
},
{
name: 'text',
type: 'string'
},
{
name: 'update',
type: 'string'
}
],
proxy: {
type: 'localstorage'
}
}
});
Ext.define('App.store.Notes', {
extend: 'Ext.data.Store',
requires: [
'App.model.Note'
],
config: {
autoLoad: true,
model: 'App.model.Note',
storeId: 'Notes',
data: [
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/02 13:00'},
{text: 'TESTTEST', update: '2014/04/03 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'},
{text: 'TESTTEST', update: '2014/04/01 13:00'}
]
},
});
stores: [
'Notes'
],
Ext.define('App.view.List', {
extend: 'Ext.dataview.List',
xtype: 'app-list',
requires: [
'Ext.TitleBar'
],
config: {
layout: 'fit',
store: 'Notes',
itemTpl: '{text} - {update}',
items: [{
xtype: 'titlebar',
title: 'memo',
docked: 'top',
items: [{
text: 'New',
action: 'new',
align: 'right'
}]
}]
}
});
Ext.define('App.view.Main', {
extend: 'Ext.Container',
xtype: 'app-main',
requires: [
'App.view.List'
],
config: {
layout: 'fit',
items: [{
xtype : 'app-list'
}]
}
});
表示してみる
Ext.define('App.view.Edit', {
extend: 'Ext.form.Panel',
xtype: 'app-edit',
config: {
layout: {
type: 'vbox'
},
items: [{
xtype: 'textareafield',
label: 'memo',
name: 'text',
placeHolder: '内容を入力...',
//flex: 1
height: 400
}, {
xtype: 'textfield',
label: 'date',
name: 'update',
readOnly: true
}, {
xtype: 'toolbar',
docked: 'top',
items: [{
text: 'Back',
action: 'back',
ui: 'back'
}, {
xtype: 'spacer'
}, {
text: 'Save',
handler: function(button) {
var form = button.up('app-edit'),
vals = form.getValues();
form.fireEvent('app-memo-save', vals);
}
}]
}]
}
});
Ext.define('App.view.Main', {
extend: 'Ext.Container',
xtype: 'app-main',
requires: [
'App.view.List',
'App.view.Edit'
],
config: {
layout: 'card', // 変更
activeItem: 1,
items: [{
xtype : 'app-list'
},{
xtype : 'app-edit'
}]
}
});
表示してみる
activeItem: 1,
を消す
Ext.define('App.controller.Main', {
extend: 'Ext.app.Controller',
config: {
}
});
refs: {
main: '.app-main',
edit: '.app-edit'
},
control: {
'.app-list': {
'select': 'onSelect'
}
}
onSelect: function(comp, record) {
var me = this,
view = me.getMain(),
edit = me.getEdit();
edit.setRecord(record);
view.setActiveItem(1);
}
ここで、表示させてみて、リストが選択されるとフォームが表示されるのを確認
Backボタンの処理を追加する
Ext.define('App.controller.Edit', {
extend: 'Ext.app.Controller',
config: {
}
});
refs: {
main: '.app-main',
edit: '.app-edit'
},
control: {
'.app-edit button[action=back]': {
'tap': 'onBack'
}
}
},
onBack: function() {
var me = this,
view = me.getMain();
view.setActiveItem(0);
}
controllers: [
'Main',
'Edit'
],
Saveボタンを押したときに保存
'.app-edit': {
'app-memo-save': 'onSave'
},
onSave: function(val) {
var me = this,
store = Ext.getStore('Notes'),
edit = me.getEdit(),
record = edit.getRecord();
val.update = Ext.Date.format(new Date(), 'Y/m/d H:m');
record.set(val);
store.sync();
me.onBack();
}
ここまでで動作確認、変更結果が保存されることを確認
- 一旦保存したら、localStrage にデータができるので data 文を削除
- リロードしてもデータが表示される
- 保存したデータが反映されるようになる
'.app-list button[action=new]': {
'tap': 'onAdd'
}
onAdd: function() {
var me = this,
model = Ext.create('App.model.Note'),
view = me.getMain(),
edit = me.getEdit();
edit.setRecord(model);
view.setActiveItem(1);
},
新規保存に対応
onSave: function(val) {
var me = this,
store = Ext.getStore('Notes'),
edit = me.getEdit(),
record = edit.getRecord(),
isNew = Ext.isEmpty(record.get('update'));
val.update = Ext.Date.format(new Date(), 'Y/m/d H:m');
record.set(val);
if (isNew) {
record.set('id', Ext.String.format('memo{0}', Ext.Date.now()));
store.add(record);
}
console.log(record.data);
store.sync();
me.onBack();
}
- 沢山のjsファイルが読み込まれていることを確認
^C で Webサーバーを停止
sencha app build
build/production/App に移動
sencha web -port 8080 start -map ./
- Devツールを開いた状態でブラウザでアクセス。
- ロードするファイルが少ないのを確認
- リロードするとさらに少なくなるのを確認
- Webサーバー止めてリロードしても動作するのを確認