Sencha Touch2012. 10. 7. 18:07

마소 연재를 하였습니다.

주제는 : 센차 터치 2 핵심 가이드

 

 

http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=41056

COVER STORY

피할 수 없는 선택
정보보호

1부 | 법과 정책으로 본 정보보호의 현주소 | 전주현    120
2부 | 엔터프라이즈 환경을 위한 정보보호 | 성장열    124
3부 | 스마트 시대 달라지는 데이터베이스 정보보호 | 김형훈   128
4부 | 게임 산업에서의 정보보호의 의미와 이슈 | 강병탁    134
5부 | 로그인 보안 프로세스의 구성과 구축 | 한주성    138

INFORMATION

마소지기|열린 결말 │전도영 편집장      63
기자수첩|본질에 대한 이해 없는 막무가내 규제 버려야│이병혁 기자  65
MASO news|드디어 배일 벗은 아이폰5 외      66
Hardware Review|WD 레드 WD20EFRX 외      92
Books Review|HTML5 게임 프로그래밍 외      112
Column & Interview

Interview|염동훈 구글코리아 대표 │심정선 기자     72
김준수 부산정보산업진흥원 IT사업부장 │한종진 기자    74
데이비드 A. 차파 퀀텀 CTE │조수현 기자      76
컨퍼런스 취재 | 애자일 코리아 컨퍼런스 2012 | 한종진 기자   80
안랩 코어 2012 | 이병혁 기자       82
2012 IT 엑스포 부산 | 한종진 기자      84
법률사무소 민후의 SW 이야기 | 소프트웨어 공유의 문제점    81
소프트웨어 개발비를 손해배상 청구하는 산정법     83
공개SW 활용 성공사례│LG유플러스 │이병혁 기자     86
KINX │조수현 기자        88
텔레칩스 │조수현 기자        90
개발자가 만난 사람|최고를 만들기 위해 우직하게 걷고 있는 DBMS 개발자 |용영환 96
The War of IT|이순신과 한산도 대첩|김영옥     98
아키텍트 & 이노베이터 | 국내 의료정보화는 왜 실패했는가? | 신현묵  102
굿모닝 헬스| “목 디스크 수술이 무섭고 두려워요!” │ 모커리한방병원  105
수퍼개발자의 꿈| “원하면 노력하고 바라면 꿈을 꿔라” | 김지웅   106
여행이야기|네가지 없는 여행객, 이러면 아니 아니 되오 | 월간 여행스케치  110
패턴 이야기 | 플러그인 패턴(1) | ???      142
IT Certificate| IT 감사와 내부감사 │ 조희준     146
Developer Works | SNS와 연계된 홈오토메이션 개발 │ 최재규   150
IT 비즈니스 | BUX가 기업에 주는 가치 | 김영현     180
네트워크 이야기 | NTP와 로그 설정 | 박상철     184
Focus On | 심리적 보상의 메커니즘 | 박범진     188
마소플러스 | 개발자의 적 버그, 이렇게 잡자 | 허국현    206
Special Report

C++ 중심의 혁신이 시작됐다
비주얼 스튜디오 2012

1부 | 개발자의 르네상스를 꿈꾼다, 비주얼 스튜디오 2012 | 조성우   158
2부 | 비주얼 C++11에서의 C++11  | 최흥배     160
3부 | C++를 활용한 윈도우8 앱 개발 | 엄준일|     162
4부 | 병렬 프로그래밍 혁신, C++ AMP | 조진현     164
5부 | 비주얼 스튜디오 2012 테스트 익스플로러 활용 | 신영진   168
6부 | 현대화된 드라이버 개발 | 김성은      174
Smart & Mobile

아이클라우드를 활용한 앱 개발 │ 안진섭      194
아이클라우드를 이용한 맥 앱 만들기 (2)
S펜 SDK를 활용한 갤럭시 노트 애플리케이션 개발 │ 이원희 외    200
갤럭시 노트 애플리케이션 개발 실전 프로젝트
실전강의실

누구나 쉽게 구축할 수 있는 하둡 기반 분산시스템 | 이지훈   208
아파치 하둡을 활용한 로그 저장 및 처리
센차 터치 2 핵심 가이드 | 안병도      216
센차 SDK 툴
Cilk Plus 병렬 프로그래밍 | 고형호      222
인텔 패러럴 어드바이저와 함께하는 Cilk Plus – 루프 병렬성
Play! 프레임워크와 함께 하는 즐거운 웹 개발 | 김용웅 외    228
Play! 프레임워크로 상용 서비스 개발하기
모바일 및 데스크톱PC를 위한 가볍고 빠른 GUI 툴킷 EFL | 박춘언 외  234
EFL 핵심 기능 알아보기
질의응답 사이트 예제로 배우는 ASP.NET MVC3 | 허국현    240
WYSIWYG 에디터 장착
MASO 캠퍼스

캠퍼스 소식 | 교육과학기술부, 과학-비즈니스 융합 전문가 양성한다 외  246
IT JOB Trend | 직장인 52.3%, “현재 자기계발 중” | 잡코리아   248
자기계발가이드 | 제 5회 대학생 전력기술 아이디어 공모전 외   249
네 꿈을 펼쳐라!| 숭실대학교 구글개발자그룹 | 심정선 기자   250

스텝 바이 스텝

data-p로 열어가는 새로운 세상 | 최시영      252
새로운 범용 프로그래밍 언어, data-p
자바카페와 함께하는 웹 기초 강좌 | 이은미     258
JSP(Java Server Page) 활용하기
DBMS

뉴스│한국정보화진흥원, 공공 데이터 품질관리 위한 커뮤니티 발족 외  266
컬럼│
엑시엄이 보는 DB 세상 | 이현희       268
Large Object – LOB의 저장방식 및 사용법
리포트│
퀴즈로 배우는 SQL | 기민용       270
숫자를 영문으로 표기하기
개발자가 꼭 알아야할 데이터베이스 지식 | 임주한     274
DB2 레인지 파티션의 실전 적용
퀴즈이벤트         116
독자가 편집자에게        156
미리 보는 11월호         192
게시판           264
정기구독 안내         280
이 달의 디스켓 www.imaso.co.kr
실전강의실 | Play! 프레임워크로 상용 서비스 개발하기 | 김용웅 외  228
EFL 핵심 기능 알아보기 | 박춘언 외     234
스텝바이스텝 │ Java Server Page 활용하기 │ 이은미    258

Posted by yaioyaio
Sencha Touch2012. 10. 6. 12:11

sencha touch 2.1 beta3 에서 sencha app build native로 네이티브 앱 생성 시, 다음과 같은 에러가 발생하는 경우는 

[WARN ] JsParse Warning : 
message => Trailing comma is not legal in an ECMA-262 object initializer
file => /Users/yaioyaio/Sites/SenchaProject2.1/SnsPop/app.js:36,5

line => ],

js 파일의 코딩에서 마지막 값이 없는데 "콤마"가 있는 경우 경고가 발생한다.

sencha touch 2..0.x.x 버전에서 발생 하지 않던 경고이다.

즉, 

views: [
'Main',
]

또는

{xtype: 'main1'},
{xtype: 'main2'},
{xtype: 'main3'},

인 경우 마지막 값이 없는데 "콤마"가 있으면 안된다.

아직은 베타라 그런것인지는 모르겠다.

Posted by yaioyaio
Sencha Touch2012. 10. 6. 12:00

sencha touch 2.1 rc1 sencha cmd 3.0.0.188

다음의 내용은 새롭게 업그레이드 된 버전을 가지고 간단한 테스트 작업을 해 보는 것이다. 아직은 베타 버전이므로 모든 프로젝트에 적용하는 것은 아직은 시기상조이므로 이점은 분명 알고 테스트를 하기 바란다. 다만, 조금 더 좋아진 환경을 확인 하는 것으로 만족을 해야 한다.

그럼 본격적으로 테스트를 해 보는 과정을 알아 보자.

첫 번째. 다운로드 및 압축 해제와 폴더 복사.

http://www.sencha.com/forum/announcement.php?f=92&a=36

위의 사이트를 접속 하여 각 OS에 맞는 파일을 다운로드 받는다.

다운 받은 파일은 <그림 1>과 같이 2가지이다.

<그림 1>다운로드 파일.

다운로드 받은 파일 중 SenchaCmd-3.0.0.188-osx.app.zip 파일을 압축 해제 한다. 해제한 파일을 설치한다.

<그림 2>는 SenchaCmd-3.0.0.188을 설치한 내용을 터미널에서 본 내용이다. 그리고 <그림 3>은 파인더에서 생성된 폴더 구조를 확인한 것이다.

<그림 2> SenchaCmd-3.0.0.188 터미널에서 확인.

<그림 3> SenchaCmd-3.0.0.188 파인더에서 확인.


지금까지 SenchaCmd-3.0.0.188 설치를 하였고, 설치된 내용을 <그림 2>와 <그림 3>을 통해서 확인 하였다. 다음은 sencha touch 2.1-rc1 버전을 설치할 차례이다.

다운 받은 sencha-touch-2.1.0-rc1.zip 파일을 압축 해제 한다. 압축 해제한 폴더를 복사 하여 지금까지 sencha touch 작업하던 폴더와 다른 곳에 붙여 넣기를 한다. 본인의 경우는 <그림 4>와 같다.

<그림 4> sencha touch 2.1 rc1 폴더 구조.

두 번째. SenchaCmd 확인.

SenchaCmd 설치가 잘 되었는지 확인을 해 보자. 터미널에서 방금 압축 해제 하고 폴더를 복사한 곳으로 이동을 한다. 그곳에서 <그림 5>와 같이 간단하게 sencha 명령어를 테스트 해 보자. <그림 5>와 같이 나타나면 모든 것이 정상으로 끝이 난 것이다.

<그림 5> sencha 명령어 테스트.

세 번째. 프로젝트 생성 및 웹 브라우저 테스트 확인.

실제 프로젝트를 하나 생성 하자. <그림 6>과 같이 sencha generate app Test ../Test라고 입력을 해 보자. <그림 6>과 같이 결과가 보일 것이다.

<그림 6> sencha generate app Test ../Test

이제는 크롬이나 사파리에서 생성된 프로젝트를 실행하여 보자. 실제 url 주소는 각자 다를 것이다. 본인의 url 주소는 http://localhost/~yaioyaio/SenchaProject.2.1-RC1/Test/ 와 같다. <그림 7>과 같이 나오면 모든 것이 정상으로 된 것이다.

<그림 7> 웹 브라우저 테스트.

마지막으로 당부를 하나 하자면 이 번 테스트는 아직 정식 버전이 아닌 것이므로 변화가 있다는 것을 확인 하는 것으로 만족해야 한다는 것이다. 다만, 몇 가지 확인해본 결과 정식 버전이 빨리 나오기를 기다릴뿐이다.

Posted by yaioyaio
Sencha Touch2012. 10. 1. 18:24

Sencha Touch 2.0 vs Sencha Touch 2.1 beta3의  List와 DataView의 분석.

  센차 터치라는 것으로 웹앱을 개발 하면서 가장 많이 부담을 느끼는 부분이 리스트와 UI 부분이다. 기존 Sencha Touch 2.0.x 버전의 List 경우는 사용자의 터치 스크롤 감도를 떨어뜨려 사용성의 불만을 표시 하고 있으며, 이런 속도 문제가 UI 부분에도 많은 영향을 미치는 것을 알고 있다. 앱을 사용 하는 사용자도 만족스럽지 못하다고 이야기한다. 그래서 센차 터치를 이용한 하이브리드 앱을 개발하는데 있어 망설여지고, 다시 네이티브 앱 개발로 돌아 가는 경우도 심심치 않게 보이는 것 같다. 그런데 이 번에 Sencha 사에서 새로운 테스트 버전인 Sencha Touch 2.1 beta3 버전을 내 놓았고, 그 내용이 Sencha 홈 페이지의 포럼을 통하여 알려 지게 되었다. 그 새로운 버전에서 가장 심각한 부분인 List가 새롭게 변경 되었다고 한다.

  이 번 문서의 내용은 새롭게 변경된 스크롤 부분의 내용을 가지고 이전 버전과 같이 테스트를 하면서 변화된 모습을 보고 싶다. 이 번 테스트는 전문적인 지식을 바탕으로 “이것이 정답이다”라고 입증 하고 판단 하는 것 보다는, 일반적인 상황에서 단순한 테스트를 통하여 실제 육안으로 보고 버전 차이가 어떤 것인지 그리고 어떤 내용이 추가 되었는지 확인 하면서 설명을 할 것이다. 그러므로 내용 중 실제 사실과 다른 것이 있다면 필자 및 모든 개발자와 공유 하기를 바라고, 더 발전 시켜 나가기를 바라는 마음에서 베포 하고자 한다. 이렇게 하게 된 이유는https://gist.github.com/3739543 사이트의 내용을 보면서 힌트를 얻었고 테스트 해 보고자 하는 생각이 들었기 때문이다.

※ 비교 목적.
Sencha Touch 2.1 beta3 버전을 통해 테스트 하면서 개발 과정에서 부딪히는 속도 문제의 개선 가능 여부를 단순하게 비교 및 평가하고, 가장 큰 변화가 있는 List 구현 방법의 정체를 확실하게 이해를 돕기 위한 것이다. 그리고 센차 터치로 개발하는 모든 분들에게 다시금 희망을 가질 수 있는 계기가 되었으면 하는 바램도 있다.

※ 비교 대상.
Sencha Touch 2.0.x.x  vs  Sencha Touch 2.1 beta3의 Ext.List와 Ext.DataView의 xtype에 종류에 따라 List가 어떻게 생성 되고, 어떻게 작동 하는지 비교 한다.

※ 비교 방법.

2가지 프로젝트를 생성 하여 실제 생성되는 리스트와 스크롤 시 변화 되는 모습을 파악 한다. 프로젝트는 다음과 같이 2가지 방법으로 구성을 할 것이다.

  1. Sencha Touch 2.0.1.1 Framework과 Sencha SDK Tools 2.0.0 beta3를 이용하여 생성한 ListDataView 프로젝트 테스트.
  2. Sencha Touch 2.1 Framework beta3와 Sencha Cmd 3.0.0 beta를 이용하여 생성한 DataViewDataItemListItem 프로젝트 테스트.

※ 프로젝트 생성 및 테스트.

첫 번째 ListDataView 프로젝트.

 - Sencha Touch 2.0.1.1 Framework을 이용한 프로젝트 진행.

Sencha Touch 2.0.1.1 Framework과 Sencha SDK Tools 2.0.0 beta3를 이용 하여 ListDataView 라는 프로젝트를 생성 한다. 프로젝트를 생성 하는 과정은 많은 곳에 나와 있으므로 별도로 설명을 하지 않겠다.

ListDataView 프로젝트 안에 우리가 테스트 할 몇 가지 클래스를 정의 하고 사용할 것이다. 크롬의 요소 검사를 통하여 정의된 클래스 종류에 따라 DOM 객체에 생성되는 리스트(<div>)가 어떻게 그리는지 확인 할 것이며, 스크롤 시 리스트가 어떻게 동작 하는지도 함께 확인 할 것이다.

ListDataView 프로젝트에서 사용 하는 클래스는 다음과 같이 4가지를 확장해서 사용할 것이다.

㉠ extend: 'Ext.List'

㉡ extend: 'Ext.dataview.List'

㉢ extend: 'Ext.DataView'

㉣ extend : 'Ext.dataview.component.DataItem'.

    Ext.dataview.component.DataItem을 확장한 클래스의 뷰는 다음과 같이 구성을 하였다.

                       xtype         : 'dataview',

                       useComponents : true,

                       defaultType   : 'mydataitem',

본격적으로 ListDataView 프로젝트를 생성하자. ListDataView 프로젝트 생성 명령은 다음과 같다.

e:\WebServer\SenchaProject\sencha-touch-2.0.1.1-commercial>c:\SenchaSDKTools-2.0.0-beta3\sencha app create ListDataView ../ListDataView

sencha 명령어를 위와 같이 한 이유는 필자의 PC에 Sencha SDK Tools와 Secnah Cmd가 동시에 설치 되어 있기 때문에 단순히 sencha 명령어만 하게 되면 에러가 발생한다. 그래서 위와 같이 sencha 명령어 파일이 위치한 곳을 지정하고 sencha 명령어를 실행 한 것이다.

생성된 프로젝트에서 다른 파일은 수정을 하지 말고 app.js 파일만 다음과 같이 수정 한다.

app.js 소스

//<debug>

Ext.Loader.setPath({

   'Ext': 'sdk/src'

});

//</debug>

Ext.define('MyList', {

   extend: 'Ext.List',

   xtype  : 'mylist',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataViewList', {

   extend: 'Ext.dataview.List',

   xtype  : 'mydataviewlist',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataView', {

   extend: 'Ext.DataView',

   xtype  : 'mydataview',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataItem', {

   extend : 'Ext.dataview.component.DataItem',

   xtype  : 'mydataitem',

   config : {

       dataMap : {

           getTest : { setHtml : 'test' }

       },

       test   : {flex : 1},

   },

   applyTest : function (config) {

       return Ext.factory(config, Ext.Component, this.getTest());

   },

   updateTest : function (test) {

       if (test) { this.add(test); }

   }

});

Ext.application({

   name: 'ListDataView',

   requires: [

       'Ext.dataview.List',

       'Ext.data.Store',

       'Ext.layout.HBox'

   ],

   viewport : {

       layout   : {

           type  : 'hbox',

           align : 'stretch'

       },

       defaults : {

           flex  : 1

       }

   },

   launch: function() {

       // Destroy the #appLoadingIndicator element

       Ext.fly('appLoadingIndicator').destroy();

       // Initialize the main view

       Ext.Viewport.add([

           {

               xtype : 'mylist',

               style : 'background-color: yellow',

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext List 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },{

               xtype : 'mydataviewlist',

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext dataview List 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },{

               xtype : 'mydataview',

               style : 'background-color: cyan',

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext DataView 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },{

               xtype         : 'dataview',

               style         : 'background-color: white',

               useComponents : true,

               defaultType   : 'mydataitem',

               store         : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext dataview component DataItem 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           }

       ]);

   }

});

<소스 1> ListDataView 프로젝트 소스.

위의 <소스 1>은 짧게 하느라 인라인 데이터를 5개만 했다. 실제 코딩 작업 하는 여러분은 100개씩 만들어 테스트를 하도록 합시다. 모든 코딩이 완료되면 저장하고, 일단 실행부터 시켜보자 <그림 1>과 같이 실행 화면이 보일 것이다.

<그림 1> ListDataView 프로젝트 실행 화면.

자, 이제부터 코딩된 소스를 크롬에서 돌려 보고 어떤 내용들이 있는지 확인 하는 과정을 밟아 보도록 한다. <그림 1>과 같이 나온 상태에서 첫 번째 리스트에서 마우스 오른쪽 버튼을 클릭 하여 요소 검사를 실행한다. 첫 번째 리스트의 요소 검사 결과는 <그림 2>와 같다.

<그림 2> 첫 번째 Ext.List 뷰의 요소 검사 내용.

<그림 2>를 보면 전체 내용이 캡쳐 되지는 않았다. 일부러 짧게 캡쳐를 한 것이다. 실제 100개의 <div>가 보일 것이다. sencha touch 2.0.x.x 버전으로 생성된 프로젝트의 리스트는 연결된 데이터의 개수 만큼 <div>를 모두 DOM에 그리는 것을 볼 수 있다. 나머지 3개의 모든 리스트 요소 검사를 해 보라. 똑 같은 상황이 나타날 것이다.

다음은 스크롤 시 어떻게 <div>의 움직임이 있는 지를 확인해 보도록 한다. 우선 <그림 3>을 보자. <div>의 -webkit-transform: translate3d(0px, 0px, 0px); 좌표 값이 0px, 0px, 0px으로 되어 있다.

 

<그림 3> 첫 실행 시 <div>의 -webkit-transform: translate3d(0px, 0px, 0px); 좌표 값.

마우스로 리스트를 아래로 움직이면서 요소 검사의 -webkit-transform: translate3d 좌표 값을 유심히 봐 두도록 한다. <그림 4>와 같이 가운데 부분의 좌표 값이 마이너스와 플러스로 변경 되는 것을 볼 수 있다. 결국 큰 <div>를 -webkit-transform: translate3d 이것을 이용하여 전체를 움직이고 있다는 것을 볼 수 있다. 엄청난 일을 하고 있는 것이다. 화면이 작아서 안 보이는 것처럼 생각이 되고 속도의 저하가 없을 것이라 판단이 될 수 있지만, 사실은 그렇지 않은것 같다. HTML DOM에는 많은 <div>를 생성하고 진행 하는 것을 확인 하게 되었다.

<그림 4> 마우스로 리스트를 스크롤 시 <div>의 -webkit-transform: translate3d(0px, -566px, 0px); 좌표 값.

요소 검사 화면에서 -webkit-transform: translate3d(0px, -566px, 0px); 이 부분을 마우스로 더블 클릭 하여 직접 가운데 좌표 값을 변경해 보자. 변경 하고 엔터를 치면 화면에서 리스트가 움직이는 것을 볼 수 있다.

그리고 <그림 5>를 보면 화살표로 안내 하는 화면의 내용을 보면 class="x-inner x-list-inner x-scroll-scroller"의 크기 값이 픽셀로 표시 되어 있다. 100개의 리스트를 만들기 위한 전체 가로 * 세로 크기를 우리는 알 수 있다.

<그림 5> x-inner x-list-inner x-scroll-scroller 가로 * 세로 픽셀 크기.

결국, 많은 내용의 데이터를 리스트에 뿌리기 위해서는 그 만큼의 <div>를 만들어 놓고 시작한다는 것이다. 이곳에서 일반적인 리스트와 같이 이미지와 구조화 된 내용을 보여 주고 있지 않지만, 이런 단순한 상황도 웹 브라우저를 사용하는 모바일 상황에서는 엄청난 부담이 되는 사실일 것이다. 또한 이런 리스트 뷰가 많을 수록 앱의 전체 속도는 더욱 나빠질 것이고, 앱을 사용 하는 고객 대부분은 스크롤과 메뉴 이동 시 부드럽지 못한 경험을 하게 될 것이다. 단순한 뷰를 만들어 사용 하는 것이 아니라면 많은 사용자들이 앱 사용을 꺼리게 될 것이다.

두 번째 DataViewDataItemListItem 프로젝트.

- Sencha Touch 2.1 Framework beta3를 이용한 프로젝트 진행.

Sencha Touch 2.1 Framework beta3와 Sencha Cmd 3.0.0 beta를 이용 하여 DataViewDataItemListItem 라는 프로젝트를 생성 한다. 프로젝트를 생성 하는 방법은 이전 버전과 크게 다르지 않다. 이것을 테스트 하기 위해서는 2가지를 다운 받아 압축을 해제 하고 설치 하는 과정을 거쳐야 한다. 설치 과정은 이곳에서 설명을 하지 않기로 한다.  다운 받는 곳만 알려 주도록 한다.

Sencha Touch 2.1 beta3 와 Sencha Cmd 3.0 beta 다운로드 : http://www.sencha.com/forum/announcement.php?f=89

DataViewDataItemListItem 프로젝트 안에 우리가 테스트 할 5 가지 클래스를 정의 하고 사용할 것이다. 물론 실행 하면서 테스트 하는 과정은 첫 프로젝트와 다를 것이 없다. 그때와 똑 같이 리스트 생성 방법과 스크롤 시 어떠한 변화가 있는지 확인할 것이다.

두 번째 DataViewDataItemListItem 프로젝트에서 사용할 클래스는 다음과 같이 5가지를 확장해서 구성했다.

㉠ extend: 'Ext.List'

㉡ extend: 'Ext.dataview.List'

㉢ extend: 'Ext.DataView'

㉣ extend : 'Ext.dataview.component.DataItem'

    Ext.dataview.component.DataItem을 확장한 클래스 뷰는 다음과 같이 구성을 하였다.

xtype : 'dataview'

                       useComponents : true,

                       defaultType : 'mydataitem',

㉤ extend : 'Ext.dataview.component.ListItem'

    Ext.dataview.component.ListItem을 확장한 클래스 뷰는 다음과 같이 구성을 하였다.

                       xtype : 'list',

                       useComponents : true,

                       defaultType : 'mylistitem',

DataViewDataItemListItem 프로젝트 생성 명령은 다음과 같다.

E:\WebServer\SenchaProject2.1\sencha-touch-2.1.0-beta3> sencha generate app DataViewDataItemListItem ../DataViewDataItemListItem

DataViewDataItemListItem 프로젝트를 생성 하고 난 이후 다른 파일은 수정할 필요가 없고, app.js 파일만 다음과 같이 수정한다.

소스 내용.

//<debug>

Ext.Loader.setPath({

   'Ext': 'touch/src',

   'DataViewDataItemListItem': 'app'

});

//</debug>

Ext.define('MyList', {

   extend: 'Ext.List',

   xtype  : 'mylist',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataViewList', {

   extend: 'Ext.dataview.List',

   xtype  : 'mydataviewlist',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataView', {

   extend: 'Ext.DataView',

   xtype  : 'mydataview',

   config : {

       itemTpl: '{test}'

   }

});

Ext.define('MyDataItem', {

   extend : 'Ext.dataview.component.DataItem',

   xtype  : 'mydataitem',

   config : {

       dataMap : {

           getTest : { setHtml : 'test' }

       },

       test   : { flex : 1 },

   },

   applyTest : function (config) {

       return Ext.factory(config, Ext.Component, this.getTest());

   },

   updateTest : function (test) {

       if (test) { this.add(test); }

   },

});

Ext.define('MyListItem', {

   extend : 'Ext.dataview.component.ListItem',

   xtype  : 'mylistitem',

   config : {

       dataMap : {

           getTest : {setHtml : 'test'}

       },

       test   : {flex : 1},

   },

   applyTest : function (config) {

       return Ext.factory(config, Ext.Component, this.getTest());

   },

   updateTest : function (test) {

       if (test) { this.add(test); }

   },

});

Ext.application({

   name: 'DataViewDataItemListItem',

   requires: [

       'Ext.MessageBox',

       'Ext.dataview.List',

       'Ext.data.Store',

       'Ext.layout.HBox'

   ],

   viewport : {

       layout   : {

           type  : 'hbox',

           align : 'stretch'

       },

       defaults : {

           flex  : 1

       }

   },

   launch: function() {

       // Destroy the #appLoadingIndicator element

       Ext.fly('appLoadingIndicator').destroy();

       // Initialize the main view

       Ext.Viewport.add([

           {

               xtype : 'mylist',

               style : 'background-color: yellow',

               flex  : 1,

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext List 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },

           {

               xtype : 'mydataviewlist',

               flex  : 1,

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext dataview List 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },

           {

               xtype : 'mydataview',

               flex  : 1,

               style : 'background-color: cyan',

               store : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext DataView 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },

           {

               xtype         : 'dataview',

               flex          : 2,

               useComponents : true,

               defaultType   : 'mydataitem',

               store         : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext dataview component DataItem 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           },

           {

               xtype         : 'list',

               flex          : 2,

               style         : 'background-color: white',

               useComponents : true,

               defaultType   : 'mylistitem',

               store         : {

                   fields : ['test'],

                   data   : [

                       { test : 'Ext dataview component ListItem 1'   },

                       { test : '2'   },

                       { test : '3' },

                       { test : '4'   },

                       { test : '5'   },

                       { test : '6' },

                       { test : '7'   },

                       { test : '8'   },

                       { test : '9' },

                       { test : '10'   },

                   ]

               }

           }

       ]);

   }

});

<소스 2> DataViewDataItemListItem 프로젝트 소스

<그림 6> DataViewDataItemListItem 프로젝트 실행 화면.

두 번째 생성한 DataViewDataItemListItem 프로젝트를 분석 하기로 하자. 작성된 코드를 저장 하고 크롬에서 돌려 보도록 한다. <그림 6>과 같이 실행된 내용이 보일 것이다. 첫 번째 프로젝트에서 사용했던 방법과 동일하게 리스트에서 마우스 오른쪽 버튼을 클릭 하여 요소 검사를 실행한다. DataViewDataItemListItem 프로젝트의 첫 번째 리스트의 요소 검사 결과는 <그림 7>과 같다.

자, 여기에서 중요한 것 하나를 확인할 수 있다. EXT.List를 사용하는 경우 인라인 데이터 개수 만큼 리스트가 요소 검사에서 보이는 것이 아니고,웹 브라우서 화면에 보이는 리스트 개수보다 2개의 <div>가 더 생겼을 뿐이다. 그러니까 화면에서 보이는 리스트 개수가 4개이면 요소 검사에서 보이는 <div>는 총 6개가 생기는 것이다. 첫 ListDataView 프로젝트에서 생성된 <div>의 개수 100개를 생성 하지 않았다는 것이다.  이러한 내용은 sencha touch 2.1 beta3에서 새롭게 변경된 리스트이다. 다음의 url 주소를 보면 나와 있는 내용이다.

<그림 7> 첫 번째 Ext.List 뷰의 요소 검사 내용.

What’s Coming in Sencha Touch 2.1 을 보면 자세하게 <그림 8>과 같이 안내가 되어 있다. 네이티브에서 구현 하는 리스트와 같은 방식으로 리스트를 재 사용 하는 스텍 구조의 형태로 되어 있다는 것이다. 데이터 개수 만큼 리스트를 만들지 않으므로 당연히 가벼워 질 것이며, 동적으로 리스트를 스토어와 바인딩 된다 봐야 할 것이다.

<그림 8> Advanced List component with Infinite scrolling

중요한 사실을 하나 확인을 하였다. 나머지 4개의 리스트보 같은 방법으로 확인을 각자 해 보기를 바란다. 테스트를 하다 보면 List가 들어 가는 클래스를 사용하는 경우는 데이터 만큼의 리스트를 만들지 않고 동적으로 바인딩 하여 사용 하는 스텍 구조의 리스트를 재 사용하는 것을 볼 수 있다.

우선 첫 번째 리스트의 CSS 클래스 내용을 보도록 하자. <그림 9>를 보면, Ext.List를 사용 하는 리스트의  첫 번째 리스트 요소 검사에 대한 내용이다. 새로운 CSS의 클래스가 보일 것이다. “x-list-item-first x-list-header-wrap” 클래스가 추가 되었으며, 첫 번째라는 것을 알 수 있게 “x-list-item-first“이 들어 있다.

<그림 9> Ext.List의 첫 번째 리스트 요소 검사.

<그림 10>를 보면, Ext.List를 사용 하는 리스트의  마지막 리스트 요소 검사에 대한 내용이다. 새로운 CSS의 클래스가 보일 것이다. “x-list-item-last x-list-footer-wrap” 클래스가 추가 되었으며, 첫 번째라는 것을 알 수 있게 “x-list-item-last“이 들어 있다.

<그림 10> Ext.List의 마지막 리스트 요소 검사.

이 번에는 리스트를 스크롤 하여 어떻게 변경 되는지 확인을 해 보자. <그림 11>를 보자. Ext.List를 사용 하는 리스트의  경우 스크롤 하면 각각의 리스트에 있는 CSS 스타일 속성 중 하나인  -webkit-transform: translate3d(0px, 157px, 0px)의 가운데 좌표 값이 변경 되는 것을 육안으로 확인 가능하다. DOM에 그려진 <div> 리스트 전체의 -webkit-transform: translate3d 좌표 값을 변경 하는 것이다. 첫 번째 ListDataView 프로젝트에서는 100개의 <div>를 가지고 있는 <div>가 좌표 값을 변경 하는 것을 봤다. sencha touch 2.1 beta3에서는 그렇게 작동 하지 않는 다는 것을 이번 테스트를 통해 확인을 하였다.

<그림 11> 리스트를 스크롤 시 변화되는 -webkit-transform: translate3d 좌표 값.

리스트의 전체 크기를 첫 프로잭트에서 확인을 하였다. 두 번째 프로젝트에서 리스트 전체 크기는 <그림 12>와 같다. 당연히 세로 크기가 엄청나게 많이 줄어 들었다.

<그림 12> DataViewDataItemListItem 프로젝트 첫 번째 리스트 세로 크기.

마지막으로 한 가지를 더 확인해 보도록 하자. 기존 버전에서 제공 하는 Ext.dataview.component.DataItem 클래스가 있지만, sencha touch 2.1 beta3에서는 Ext.dataview.component.ListItem 클래스가 하나 추가 되었다. 사용자 정의 리스트를 만들어 사용 하는데, Ext.List와 같은 역활의 리스트를 구현 하는  Ext.dataview.component.ListItem 클래스이다. 마지막 리스트까지 확인을 해 보았다면 무엇을 의미 하는지 알 수 있을 것이다.

세 번째 결론 및 맺음말.

  결론을 말씀 드리자면, 센차사의 사이트내 포럼을 통해 새롭게 공개한 sencha touch 2.1 beta3 버전은 큰 일을 한 것으로 판단이 된다. 오픈 소스를 제공하는 회사에서 많은 개발자의 불만을 크게 반영한 것이라 볼 수 있다. 리스트와 스크롤 방식이 기존 네이티브에서 제공 하는 리스트 재 사용을 할 수 있도록 스텍 구조로 변경이 되었다는 것이 너무 반가운 소식이다. 모바일에서 테스트를 하지는 못 했지만, 여태 테스트 한 내용을 기반으로 본다면 당연히 새로운 버전의 리스트 속도가 훨씬 빠를 것이며, 전체 앱의 속도에도 많은 변화가 있을 것으로 판단이 된다. 또한, 새롭게 추가된 Ext.dataview.component.ListItem 클래스가 있다는 것을 알 수 있다.

참고 사이트.

http://www.sencha.com/forum/announcement.php?f=89

http://dev.sencha.com/deploy/sencha-touch-2.1.0-b3/release-notes.html

http://www.sencha.com/blog/whats-coming-in-sencha-touch-2-1?mkt_tok=3RkMMJWWfF9wsRokuazPZKXonjHpfsX87O8pUKazlMI%2F0ER3fOvrPUfGjI4ESsN0dvycMRAVFZl5nR9dFOOdfQ%3D%3D

https://gist.github.com/3739543

Posted by yaioyaio
Sencha Touch2012. 8. 30. 08:25

 

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com 

Ext.define.extend


이 번장은 센차 터치에서 클래스를 확장 하고 사용 하는 방법에 대하여 알아 본다.

센차 터치에서는 클래스를 정의 하게 되면 getter와 setter를 지정하지 않아도 센차 터치 클래스 내부에서 자동으로 생성한다.

Ext.Toolbar 를 확장 하여 MyToolbar 클래스를 정의 하였다. MyToolbar 클래스의 xtype을  'mytoolbar'으로 명명 하였다.

MyToolbar 클래스의 구성 옵션으로 items와 control을 가지고 있으며, 클래스 내부에 버튼 관련된 이벤트 함수가 정의 되어 있다.

이벤트 함수에서는 버튼의 text값을 얻어 오는 방법도 같이 소개 되어 있다.

그리고 Ext.Toolbar 를 확장 하여 생성한 MyToolbar 클래스를 Ext.Container에서 사용하고 있다.

실행 화면은 다음과 같다.

사용 화면의 구조는 상단에 사용자 클래스를 사용 하였으며, docked:’top’으로 지정 하여 코딩 되어 있다.

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Creating a custom component in Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               Ext.define('MyToolbar', {
                   extend : 'Ext.Toolbar',
                   xtype  : 'mytoolbar',
                   config : {
                       items: [
                           {
                               text   : 'Red',
                               action : 'red'
                           },{
                               text   : 'Orange',
                               action : 'orange'
                           },{
                               text   : 'Yellow',
                               action : 'yellow'
                           },{
                               text   : 'Green',
                               action : 'green'
                           },{
                               text   : 'Blue',
                               action : 'blue'
                           }
                       ],
                       control: {
                           'button[action=red]': {
                               tap: 'onButtonTap'
                           },
                           'button[action=orange]': {
                               tap: 'onButtonTap'
                           },
                           'button[action=yellow]': {
                               tap: 'onButtonTap'
                           },
                           'button[action=green]': {
                               tap: 'onGreenTap'
                           },
                           'button[action=blue]': {
                               tap: 'onBlueTap'
                           }
                       }
                   },
                   onButtonTap: function (btn) {
                       Ext.Msg.alert('You clicked the ' + btn.getText() + ' button');
                   },
                   onGreenTap: function (btn) {
                       Ext.Msg.alert('Custom Green handler');
                   },
                   onBlueTap: function (btn) {
                       Ext.Msg.alert('Le Custom Blue handler');
                   }
               });
               
               Ext.create('Ext.Container', {
                   fullscreen : true,
                   items      : [
                       {
                           xtype  : 'mytoolbar',
                           docked : 'top'
                       }
                   ]
               });
           }
       });
   </script>
</body>
</html>

출처 : http://senchaexamples.com/

Posted by yaioyaio
Sencha Touch2012. 8. 28. 21:56

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com 

Ext.Carousel.ui


이 번장은 Carousel의 ui를 사용하는 방법을 알아 보는 시간이다.

ui를 변경함으로서 밝고 어둡게 바꾸는 것이다.

사용 하는 방법은 다음과 같은 옵션을 조정함으로서 가능하다.

ui     : 'dark',

실행 화면은 다음과 같다.


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Setting the UI theme on the Ext.Carousel component in Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               var darkUI = Ext.create('Ext.Carousel', {
                   defaults: {
                       styleHtmlContent: true
                   },
                   ui     : 'dark',
                   width  : '100%',
                   height : 100,
                   items  : [
                       {
                           html  : 'red (ui:dark)',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange (ui:dark)',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow (ui:dark)',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green (ui:dark)',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue (ui:dark)',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
               
               var lightUI = Ext.create('Ext.Carousel', {
                   defaults: {
                       styleHtmlContent: true
                   },
                   ui     : 'light',
                   width  : '100%',
                   height : 100,
                   items  : [
                       {
                           html  : 'red (ui:light)',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange (ui:light)',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow (ui:light)',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green (ui:light)',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue (ui:light)',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
               
               Ext.create('Ext.Panel', {
                   fullscreen : true,
                   items      : [
                       darkUI,
                       lightUI
                   ]
               });
           }
       });
   </script>
</body>
</html>

출처 : http://senchaexamples.com/


Posted by yaioyaio
Sencha Touch2012. 8. 28. 21:55

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com 

Ext.Carousel.next


이 번장은 Carousel을 배너 이미지 슬라이딩 쇼를 하는 것과 같은 효과를 주는 것을 알아 보는 시간이다.

방법은 자바스크립트의 setInterval을 사용하여 반복적으로 Carousel의 items을 바꾸는 것이다.

setInterval(function () {
                   crsl.next();
                   if (crsl.getActiveIndex() === crsl.getMaxItemIndex()) {
                       crsl.setActiveItem(0);
                   }
               }, 2000); // setInterval()

실행 화면은 다음과 같다. 캡쳐를 한 상태라 정지된 모습이지만 실제 실행을 해 보면 슬라이딩 되는 것을 확인 할 수 있다.


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Programmatically changing the active item on an Ext.Carousel component in Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               var crsl = Ext.create('Ext.Carousel', {
                   defaults: {
                       styleHtmlContent: true
                   },
                   fullscreen : true,
                   items      : [
                       {
                           html  : 'red',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
               
               setInterval(function () {
                   crsl.next();
                   if (crsl.getActiveIndex() === crsl.getMaxItemIndex()) {
                       crsl.setActiveItem(0);
                   }
               }, 2000); // setInterval()
           }
       });
   </script>
</body>
</html>

출처 : http://senchaexamples.com/

Posted by yaioyaio
Sencha Touch2012. 8. 28. 21:54

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com 

Ext.Carousel.indicator


이 번장은 Carousel에 보면 나오는 indicator의 사용법을 알아 보는 시간이다.

indicator  : false, 인디게이터를 안 보이게 하는 옵션이며, indicator  : true 는 인디게이터를 보이도록 하는 것이다.

다음은 실제 실행한 화면이다. 지금 화면에서는 인디게이터가 안 보이는 상태이다.


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Removing the indicator dots from an Ext.Carousel component using Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               Ext.create('Ext.Carousel', {
                   defaults: {
                       styleHtmlContent: true
                   },
                   indicator  : false,
                   fullscreen : true,
                   items      : [
                       {
                           html  : 'red',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
           }
       });
   </script>
</body>
</html>

출처 : http://senchaexamples.com/

Posted by yaioyaio
Sencha Touch2012. 8. 28. 21:53

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com 

Ext.Carousel.direction



이 번장은 센차 터치에서 제공 하는 Carousel에 대하여 알아 보는 두 번째 시간입니다.

이 전장과는 다르게 위.아래로 움직이는 것을 알아 볼 차례이다. 사용법은 이전과 같이 무척 간단하며, 실제 실행 화면은 다음과 같습니다.

옵션 중 direction의 값을 ‘
vertical’을 지정 하면 된다.



<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Creating a vertically scrolling Ext.Carousel component in Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               var crsl = Ext.create('Ext.Carousel', {
                   defaults: {
                       styleHtmlContent: true
                   },
                   fullscreen : true,
                   direction  : 'vertical',
                   items      : [
                       {
                           html  : 'red',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
           }
       });
   </script>
   
</body>
</html>

출처 : http://senchaexamples.com/

Posted by yaioyaio
Sencha Touch2012. 8. 28. 21:51

센차 터치 2.0 , sencha touch 2.0.1.1 senchaexamples.com Ext.Carousel


이 번장은 센차 터치에서 제공 하는 Carousel에 대하여 알아 보는 시간입니다.

사용 하는 방법은 무척 간단하며, 실제 실행 화면은 다음과 같습니다.

Ext.Carousel을 사용하면 된다. 마우스로 왼쪽에서 드래그 하거나 반대로 드래그 하면 items 안에 들어 가는 컴포넌트 요소가 하나씩 화면을 교체하면서 카드가 바뀌듯 체인지된다.

옵션 중 direction의 값을 ‘vertical’을 지정 하지 않으면 기본 값으로
horizontal이 적용된다.


<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8"/>
   <link href="../../frameworks/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
   <title>Creating a simple carousel using the Ext.Carousel component in Sencha Touch 2</title>
</head>
<body>
   <script src="../../frameworks/sencha-touch-all.js" type="text/javascript"></script>
   <script type="text/javascript">
       /*
           sencha touch 2.0.1.1-commercial
       */
       Ext.application({
           launch: function () {
               Ext.create('Ext.Carousel', {
                   fullscreen : true,
                   defaults   : {
                       styleHtmlContent: true
                   },
                   items: [
                       {
                           html  : 'red',
                           style : 'background-color:#f00;'
                       },{
                           html  : 'orange',
                           style : 'background-color:#ffb600;'
                       },{
                           html  : 'yellow',
                           style : 'background-color:#ff0;'
                       },{
                           html  : 'green',
                           style : 'background-color:#80ff4d;'
                       },{
                           html  : 'blue',
                           style : 'background-color:#009dff;'
                       }
                   ]
               });
           }
       });
   </script>
</body>
</html>

출처 : http://senchaexamples.com/

Posted by yaioyaio