60
はじめての Sencha Touch2 2012/11/8 1 SenchaUG 勉強会 第2回@東京 Japan Sencha User Group @hiromitsuuuuu

First Sencha Touch2

  • Upload
    riaxdnp

  • View
    3.217

  • Download
    0

Embed Size (px)

DESCRIPTION

SenchaUG 勉強会 第2回@東京 での発表資料です。

Citation preview

Page 1: First Sencha Touch2

Japan Sencha User Group Japan Sencha User Group

はじめての Sencha Touch2

2012/11/8

1

SenchaUG 勉強会 第2回@東京

Japan Sencha User Group

@hiromitsuuuuu

Page 2: First Sencha Touch2

Japan Sencha User Group

11/12/2012

2

RIAのR&Dチームで Web標準系技術 やってます。

Page 3: First Sencha Touch2

Japan Sencha User Group

11/12/2012

3

学習コストやハードルが高いらしい… (´・ω・`)

最低限覚えておきたい基礎をまとめました

しょぼーん

MVC?

クラスシステム?

名前空間?

コンポーネント?

ビルド?

Page 4: First Sencha Touch2

Japan Sencha User Group

Agenda

まず知っておきたい基礎7つ 1. アプリケーションの生成 2. コンポーネントの追加 3. config option 4. イベントハンドリング 5. レイアウトシステム 6. ページ遷移 7. クラスシステムと名前空間

知っておくと便利なこと 1. 外部ライブラリの追加 2. ビルド時のちょっとしたTips 3. FlexからSencha Touch2へ

次のステップへ

11/12/2012

4

Page 5: First Sencha Touch2

Japan Sencha User Group

11/12/2012

5

http://www.riaxdnp.jp/

Sencha Touch2で Webアプリ開発【基礎編】

Page 6: First Sencha Touch2

Japan Sencha User Group

11/12/2012

6

まず知っておきたい基礎7つ

Page 7: First Sencha Touch2

Japan Sencha User Group

11/12/2012

7

スケルトンを作って app.jsに書いてみる

(`・ω・´)

Page 8: First Sencha Touch2

Japan Sencha User Group

1. アプリケーションの生成

11/12/2012

8

Page 9: First Sencha Touch2

Japan Sencha User Group

11/12/2012

9

Ext.application({ name: 'myApp', launch: function() { console.log('Application launched!'); } });

Page 10: First Sencha Touch2

Japan Sencha User Group

11/12/2012

10

Ext.application({ name: 'myApp', launch: function() { console.log('Application launched!'); } });

Ext.application • アプリケーションの生成 • ページ読み込み後に呼ばれる • 引数:オブジェクト生成時に必要なconfigオブジェクト

name • アプリケーションの名前空間 • クラス名は常にこの名前空間から始まる

launch • アプリの起動時に一度だけ呼び出される • これもconfigオブジェクト

アプリケーションの生成

Page 11: First Sencha Touch2

Japan Sencha User Group

11/12/2012

11

Page 12: First Sencha Touch2

Japan Sencha User Group

2.ルートコンテナへのコンポーネントの追加

11/12/2012

12

Page 13: First Sencha Touch2

Japan Sencha User Group

11/12/2012

13

UIコンポーネント

Page 14: First Sencha Touch2

Japan Sencha User Group

11/12/2012

14

Ext.application({ name: 'myApp', requires: [ 'Ext.Panel' ], launch: function() { var myPanel = Ext.create("Ext.Panel"); Ext.Viewport.add(myPanel); } });

Page 15: First Sencha Touch2

Japan Sencha User Group

ルートコンテナへのコンポーネントの追加 11/12/2012

15

Ext.Viewport • 画面全体を表すルートコンテナ • UIコンポーネントをaddしていくことで画面を作成

Ext.create • インスタンスを生成するメソッド • 第1引数:クラスの完全修飾名 • 第2引数:オブジェクト生成時に必要な設定オブジェクト

requires • 必要コンポーネントのインポート • 動的に読み込まれる

Ext.application({ name: 'mysundbox', requires: [ 'Ext.Panel' ], launch: function() { var myPanel = Ext.create("Ext.Panel"); Ext.Viewport.add(myPanel); } });

Page 16: First Sencha Touch2

Japan Sencha User Group

11/12/2012

16

Page 17: First Sencha Touch2

Japan Sencha User Group

3. config option

11/12/2012

17

Page 18: First Sencha Touch2

Japan Sencha User Group

11/12/2012

18

titlebar

html

panel

Page 19: First Sencha Touch2

Japan Sencha User Group

11/12/2012

19

launch: function() { Ext.create("Ext.Panel", { fullscreen: true, items: [{ xtype: 'titlebar', docked: 'top', title: 'Welcome' },{ html: [ "First page.<br>", "link : <a href=¥”http://www.riaxdnp.jp/¥">”, "riaddnp</a>" ].join("") }] }); }

Page 20: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

20

config option • 新しいオブジェクトを生成する際に引数として指定 • コンポーネントごとに異なる • 生成後も好きなタイミングで変更可能 • setterとgetterが自動生成される

items config • コンテナ内に子要素を内包するための仕組み • インラインで生成される

launch: function() { Ext.create("Ext.Panel", { fullscreen: true, items: [{ xtype: 'titlebar', docked: 'top', title: 'Welcome' },{ html: [ "First page.<br>", "link : <a href=¥”http:“, "//www.riaxdnp.jp/¥">”, "riaddnp</a>" ].join("") }] }); }

Page 21: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

21

xtype • コンポーネントのショートカット名

• Items config内で指定する場合 • 要素を取得するためのセレクタ

完全修飾名 xtype

Ext.Panel panel

Ext.dataview.List list

Ext.TitleBar titlebar

Ext.Button button

Ext.picker.Picker picker

Page 22: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

22

設定オブジェクトが増える …!!

Page 23: First Sencha Touch2

Japan Sencha User Group

11/12/2012

23

Page 24: First Sencha Touch2

Japan Sencha User Group

11/12/2012

24

items:[{ xtype: "fieldset", title: "フォーム", items:[{ xtype: "textfield", labelWidth: "35%" label : 'text1' },{ xtype : "datepickerfield", label : "日付", picker : { yearFrom : 1930 } },{ xtype: "textfield", labelWidth: "35%" label : 'text2' },{ xtype: "textfield", labelWidth: "35%" label : 'text3' }] }]

Page 25: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

25

共通するものはdefaultsにまとめましょう

defaults • すべての子コンポーネントに適用する設定を記述

Page 26: First Sencha Touch2

Japan Sencha User Group

11/12/2012

26

items:[{ xtype: "fieldset", title: "フォーム", defaults:{ xtype: "textfield", labelWidth: "35%" }, items:[{ label : 'text1' },{ xtype : "datepickerfield", label : "日付", picker : { yearFrom : 1930 } },{ label : 'text2' },{ label : 'text3' }] }]

Page 27: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

27

ネストが深くなる…!

Page 28: First Sencha Touch2

Japan Sencha User Group

config option 11/12/2012

28

別クラスに切り出しましょう

Page 29: First Sencha Touch2

Japan Sencha User Group

4.イベントハンドリング

11/12/2012

29

Page 30: First Sencha Touch2

Japan Sencha User Group

11/12/2012

30

Page 31: First Sencha Touch2

Japan Sencha User Group

11/12/2012

31

{ xtype: 'button', centered: true, text: 'My Button', handler: function() { alert("You tapped me"); } }

Page 32: First Sencha Touch2

Japan Sencha User Group

イベントハンドリング 11/12/2012

32

handler • よく使われるイベント • デフォルトイベント

lisners • 一度に複数のハンドラーを追加

{ xtype: 'button', centered: true, text: 'My Button', handler: function() { alert("You tapped me"); } }

Page 33: First Sencha Touch2

Japan Sencha User Group

11/12/2012

33

{ xtype: 'button', centered: true, text: 'My Button', listeners: { tap: { scope: panel, fn: function() { alert("You tapped me"); this.getHtml(); } }, initialize: function() { alert("initialized"); } } }

Page 34: First Sencha Touch2

Japan Sencha User Group

イベントハンドリング 11/12/2012

34

scope • スコープを変更したい場合

• デフォルトスコープ:イベント送信元

fn: function() { this.getHtml(); }

scope: panel, fn: function() { this.getHtml(); }

thisはbutton

thisはpanel

Page 35: First Sencha Touch2

Japan Sencha User Group

5.レイアウトシステム

11/12/2012

35

Page 36: First Sencha Touch2

Japan Sencha User Group

レイアウトシステム 11/12/2012

36

VBox HBox Card

Fit Docking

複雑なレイアウトも可能

Page 37: First Sencha Touch2

Japan Sencha User Group

11/12/2012

37

Page 38: First Sencha Touch2

Japan Sencha User Group

11/12/2012

38

Ext.create(‘Ext.Container', { fullscreen : true, layout : 'vbox', items : [{ xtype : 'panel', html : 'panel1', flex : 1, style: 'background:pink;', }, { xtype : 'panel', html : 'panel2', flex : 2 }] });

Page 39: First Sencha Touch2

Japan Sencha User Group

レイアウトシステム 11/12/2012

39

Ext.create(‘Ext.Container', { fullscreen : true, layout : 'vbox', items : [{ xtype : 'panel', html : 'panel1', flex : 1, style: 'background:pink;', }, { xtype : 'panel', html : 'panel2', flex : 2 }] });

layout • コンテナのレイアウトのための設定

flex • 画面レイアウトの比

Page 40: First Sencha Touch2

Japan Sencha User Group

6.ページ遷移

11/12/2012

40

Page 41: First Sencha Touch2

Japan Sencha User Group

11/12/2012

41

Page 42: First Sencha Touch2

Japan Sencha User Group

11/12/2012

42

var nav = Ext.create('Ext.NavigationView', { fullscreen : true, items : [{ title : 'First', items : [{ xtype : 'button', text : 'Push a new view!', handler : function() { nav.push({ title : 'Second', html : 'Second view!' }); } }] }] }); Ext.Viewport.add(nav);

Page 43: First Sencha Touch2

Japan Sencha User Group

ページ遷移 11/12/2012

43

Ext.NavigationView • cardレイアウトのコンテナ • スタックへコンテナを追加、削除することでページアニメーション

• push:ビューの追加 • pop:ビューの削除

• ※Backボタンを押して戻る場合、自動的にpopされる

var nav = Ext.create('Ext.NavigationView', { fullscreen : true, items : [{ title : 'First', items : [{ xtype : 'button', text : 'Push a new view!', handler : function() { nav.push({ title : 'Second', html : 'Second view!' }); } }] }] }); Ext.Viewport.add(nav);

Page 44: First Sencha Touch2

Japan Sencha User Group

11/12/2012

44

http://docs.sencha.com/touch/2-0/#!/api/Ext.dataview.NestedList

Page 45: First Sencha Touch2

Japan Sencha User Group

ページ遷移 11/12/2012

45

Ext.dataview.NestedList • ドリルダウン形式のリスト • TreeStoreをバインディングする

var data = { text: 'Groceries', items: [{ text: 'Drinks', items: [{ text: 'Water', items: [{ text: 'Sparkling', leaf: true }, { text: 'Still', leaf: true },{……

Page 46: First Sencha Touch2

Japan Sencha User Group

7.クラスシステムと名前空間

11/12/2012

46

Page 47: First Sencha Touch2

Japan Sencha User Group

クラスシステムと名前空間 11/12/2012

47

Senchaの名前空間 • ファイルパス

• app/view/hoge/HogeHoge.js • 完全修飾名

• myApp. view.hoge. HogeHoge

app

view

hoge HogeHoge.js

Page 48: First Sencha Touch2

Japan Sencha User Group

11/12/2012

48

Ext.define(“MyApp.view.Foo ", { extend: 'Ext.Container', requires: [ ‘MyApp.view.Bar', ‘MyApp.view.Baz ' ], xtype:‘foo', config: { xtype: "container", fullscreen : true, layout : 'vbox', items: [{ flex:1, xtype: ‘bar' },{ flex:1, xtype: ‘baz' }] } });

Page 49: First Sencha Touch2

Japan Sencha User Group

クラスシステムと名前空間 11/12/2012

49

Ext.define • クラス定義(完全修飾名) • インスタンスの生成はExt.create

extend • ベースとなるクラス(完全修飾名)

xtype • 任意の短縮名称 • Requiresを書く事もわすれずに

Ext.define(“MyApp.view.Foo ", { extend: 'Ext.Container', requires: [ ‘MyApp.view.Bar', ‘MyApp.view.Baz ' ], xtype:‘foo', config: { xtype: "container", fullscreen : true, layout : 'vbox', items: [{ flex:1, xtype: ‘bar' },{ flex:1, xtype: ‘baz' }] } });

Page 50: First Sencha Touch2

Japan Sencha User Group

11/12/2012

50

知っておくと便利なこと

Page 51: First Sencha Touch2

Japan Sencha User Group

外部ライブラリの追加

11/12/2012

51

Page 52: First Sencha Touch2

Japan Sencha User Group

外部ライブラリの追加

resourcesフォルダ • 外部ライブラリやXML,画像等のリソース

app.jsonに記述 • パスを追記

• cssはcss • jsはjs • その他はresourcesに

11/12/2012

52

Page 53: First Sencha Touch2

Japan Sencha User Group

ビルド時のちょっとしたTips

11/12/2012

53

Page 54: First Sencha Touch2

Japan Sencha User Group

ちょっとしたTips

<debug>〜</debug>タグ • <debug>と</debug>タグで囲むとビルドの際にapp.jsに含まれなくなる

11/12/2012

54

function getPanel(html) { // <debug> if (!Ext.isDefined(html)) { throw new Error('html is required.'); } // </debug> var panel = Ext.create('Ext.Panel'); }

Page 55: First Sencha Touch2

Japan Sencha User Group

FlexからSencha Touch2へ

11/12/2012

55

Page 56: First Sencha Touch2

Japan Sencha User Group

11/12/2012

56

Free ActionScript to JavaScript & Sencha Migration Guide Sencha for Flex

Page 57: First Sencha Touch2

Japan Sencha User Group

11/12/2012

57

次のステップへ

Page 58: First Sencha Touch2

Japan Sencha User Group

どうやって勉強する?

本家のドキュメント・フォーラム • Guides, Videosが役に立つ • API Documentationで使えそうなxtype, config, メソッドを探して使う • 英語版でも時々古い情報があるので注意

11/12/2012

58

Page 59: First Sencha Touch2

Japan Sencha User Group

使ってみて…

• 基礎を押えれば簡単 • JSの基礎があると理解しやすい

• かゆいところに手が届く • けど複雑なことをしようとするとつまづく

• はじめからMVCで書くのがおすすめ

• 複雑なレイアウトを組みやすいかも • ライブラリ本体は重い • Androidではやっぱりもっさり • Windows Phone8でも動く!?

11/12/2012

59

今後に期待! (`・ω・´)

Page 60: First Sencha Touch2

Japan Sencha User Group

11/12/2012

60