자바스크립트/Ext JS2011. 12. 30. 12:39
Ext JS 4.1 beta가 출시 되었습니다. 새로운 것들이 좀 있겠지만 개인적으로 Doc Application을 좀 분석 해볼려고 합니다.
Ext JS 4.1 beta 를 다운로드 받아사 압축을 풀고 톰캣에 세팅을 합니다. 압축 파일이 48메가 정도입니다.

압축을 풀고 이클립스 프로젝트를 생성해서 소스를 포팅한 모습입니다.

톰캣에 올려 실행하면 아래처럼 sencha.com과 동일한 화면을 볼 수 있습니다.


제가 분석해볼려고 하는 부분은 위의 화면에서 하단 중간의 "API Docs"를 클릭하면 실행되는 어플리케이션입니다.
이 어플리케이션에는 일반적으로 개발에 필요한 요소들이 모두 존재하고 구조적으로 잘 디자인되어 있어 이것을 차용하여 향후 다른 프로젝트에서 기본 베이스로 사용해볼까 하고 생각하고 있습니다. 아무리 생각해보아도 참 잘 디자인 되어 있습니다.
그리고 제가 풀지 못했던 몇가지 문제를 이 어플리케이션을 분석하여 해결될 수 있지 않을까 기대를 하고 있습니다.


이 강좌를 따라해보시려고 한다면 위의 화면 캡쳐에서 보시는 Toturial을 공부하시고 보시는게 좋을 듯 합니다.
Posted by 베니94
자바스크립트/Ext JS2011. 12. 30. 11:56

드디어 4.1 베타가 출시 되었습니다. 그 동안 4.1 pre버전에서 발생했던 아니 4.0 버전부터
발생했던 많은 버그들이 패치되어 출시 된듯 합니다. 해서 현재 개발된 시스템에 베타 버전을
테스트 해볼 계획입니다.

Posted by 베니94
자바스크립트/Ext JS2011. 12. 22. 23:39
오늘 부터 연재할 글은 Sencha사이트의 내용을 기준으로 ExtJs를 설명하도록 하겠습니다.
(http://docs.sencha.com/ext-js/4-0)


1. Requirements


1.1. Web Browsers
Ext JS 4는 IE6에서 크롬까지 모든 브라우저를 지원한다. 뭐 모두 지원한다고 하지만 실제로는 아시는분은 아시겠지만 IE계열이 제일 형편없고 나머지 크롬이나 FF에 경우는 상당히 좋은 성능을 내고 있습니다.
IE6에 경우에는 아예 포기하는 것이 좋습니다. 저의 경우도 고객에게 IE6는 절대 사용하면 안되는 브라우저로 설득하고 꼭 업데이트 하여 최소 IE7도 아니고 IE8을 사용하도록 권고 아닌 강제하고 있습니다. 뭐 고객이 할아버지 일 경우도 있어서 아무리 강제해도 말을 듯지 않는 경우도 있습니다

1.2. Web Server
웹서버에 경우 뭘 쓰든 상관이 없습니다. Apache보다는 톰캣을 설치? 아니 설치하지 마시고 파일로 받아 압축 푸시고 사용하시는게 좋겠죠. 따로 설명하지 않겠습니다. 별게 없으니까요!!
1.3. Ext JS 4 SDK
일단 아래 주소에서 다운 받아 설치하자
http://www.sencha.com/products/sdk-tools/download/

  
2. Application Structure

2.1. Basic Structure
강제 사항은 아니지만 ExtJS 의 디렉토리 구조는 아래와 같이 하라고 권고 하고 있다.

- Document Root 
- app
       - Class1.js
       - Class2.js
- extjs
- resources
      - css
      - images
      - ... 

- app.js

- index.html


일단 Document Root아래 index.html을 생성하고 아래와 같이 코딩하자.

<html>
<head>
    <title>Hello Ext</title>

    <link rel="stylesheet" type="text/css" href="/resources/css/ext-all.css">
    <script type="text/javascript" src="/ext-debug.js"></script>
    <script type="text/javascript" src="app.js"></script>
</head>
<body></body>
</html>

이제 app.js를 아래와 같이 코딩합니다.

Ext.application({
    name: 'HelloExt',
    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'fit',
            items: [
                {
                    title: 'Hello Ext',
                    html : 'Hello! Welcome to Ext JS.'
                }
            ]
        });
    }
});

우선 코드를 실행합니다. 뷰포트위에 패널을 올리고 패널이름은 'Hello Ext'이고 패널의 내용부분에 'Hello! Welcome to Ext JS'라고 보여집니다.
이제 빌드를 해보겠습니다. 위에서 설치한 Sencha SDK가 정상적으로 설치되어 있어야 합니다.
확인은 cmd창에서 sencha라고 입력해보자.  아래와 같이 보여지면 정삭적으로 설치된것입니다.

Sencha Command v1.2.2

Copyright (c) 2011 Sencha Inc.


usage: sencha COMMAND [ARGS]


The available commands are:

   build                build a JSB project

   create jsb           generate a minimal JSB project for an application

   slice theme          slice a custom theme's images for IE


See 'sencha help COMMAND' for more information on a specific command.

 
빌드 전에 jsb파일을 생성하자. index.html파일이 있는 폴더로 이동해서 아래와 같이 실행하자.
index.html파일을 검사하고 관련 된 클래스등을 참조하여 jsb3파일을 만들게 됩니다.

D:\AppTeam\03_Project\02_eMarket\01_DevRoot\extDesigner\war\study>sencha create jsb -a http://localhost:8080/study/index.html -p app.jsb3

 
이제 jsb3파일을 이용해 빌드 작업을 해봅니다.

sencha build -p app.jsb3 -d .

 
이제 위의 작업을 실행한 폴더에 아래와 같은 두개의 파일이 생성되는 것을 볼수 있습니다.
1. all-classes.js  이 파일은 어플리케이션에서 사용할 클래스들을 모아놓는다. 현재는 비어 있을 것이다.
2. app-all.js 이 파일은  열어보시면 알겠지만 우리가 코딩한 app.js를 최소화 버전으로 만들어 은 것이다. 실제 배포시에는 이런식에 공백을 제가한 최소화빌드를 하게 되고 더 나아가면 최적화를 해서 용량을 더 줄이기도 한다.

기존 index.html파일을 카피하여 index-prod.html을 만들고 빌드 된 app-all.js파일을 이용해 실행해 보자.

<html>
<head>
    <title>Hello Ext</title>

    <link rel="stylesheet" type="text/css" href="/resources/css/ext-all.css">
    <script type="text/javascript" src="ext.js"></script>
    <script type="text/javascript" src="app-all.js"></script>
</head>
<body></body>
</html>

동일한 실행 결과를 얻을 것이다. 

'자바스크립트 > Ext JS' 카테고리의 다른 글

Ext JS 4.1 beta Doc 어플리케이션 분석1  (0) 2011.12.30
Ext JS 4.1 Beta 출시  (0) 2011.12.30
ExtJS 기반 시스템 구성도  (2) 2011.10.05
ExtJS4 모바일 스크롤 문제 해결  (1) 2011.10.04
Extjs AutoID  (0) 2011.08.13
Posted by 베니94
자바스크립트/Ext JS2011. 10. 5. 22:21
지난 9월 1차 오픈된 시스템의 시스템 구성도이다.
ExtJS를 UI프레임웍으로 정하고 3달 정도 고생해서 완성된 시스템이다. 아직도 수개월을 더 고생해야 하지만.

개인적으로 ExtJS는 흥미로운 구석이 아주 많은 놈이지만 마냥 믿고 쓰기에는 아직 우리 현실에 어울리지
 않거나 버전 4의 자질구레한 버그를 감뇌해야 한다.

Gxt (GWT+EXT)에 비해서 성능은 떨어지지만 핸들링 면에서 java기반의 Gxt보다는 잇점이 많은 듯하다.

그러나 GWT기반 개발에 경우 최종 컴파일된 소스를 운영단에 넘겨 ExtJS(최적화 하지 않은 상태)와 성능을
비교하면
상대적으로 GWT App가 훨씬 & 상당히 빠른 성능을 보인다. 이는 아마도 GWT가 컴파일 시
상당히 뛰어난
최적화 작업을 하여 결과물을 토해 난다는 결론이다.
ExtJS또는 최적화가 가능하지만 개인적인 생각이나 최적화를 아무리 잘해도 GWT보다는 못할 듯 하다.

시간 날 때 강좌나 하나 해보려고 한다. ... Gxt 강좌도 못하고 있는지라 뭐가 우선인지는 모르지만
휘발되기 전에 남겨 두어야 할텐데...

'자바스크립트 > Ext JS' 카테고리의 다른 글

Ext JS 4.1 Beta 출시  (0) 2011.12.30
[ExtJS4] Gestting Started  (0) 2011.12.22
ExtJS4 모바일 스크롤 문제 해결  (1) 2011.10.04
Extjs AutoID  (0) 2011.08.13
store에 object 삽입  (0) 2011.08.10
Posted by 베니94
자바스크립트/Ext JS2011. 10. 4. 19:57

요구사항 : 고객은 현재 개발 된 시스템(Extjs기반)이 모바일에서도 작동되게 해달라고 한다.
               그러나 PC버전이 모바일(갤탭)에서 잘 돌아가리란 보장이 없는 관계로 테스트를 해보던 중
               결정적으로 스크롤 특히 그리드가 문제가 생겼다. PC에서는 우측 스크롤과 하단 스크롤이 
               보이지만 모바일로 넘어가면 스크롤이 없어지고 데이터가 묻혀버리는 현상이 발생한다.
               이 부분을 해결하기 위해서 구글링을 한 결과 2가지 대안을 찾았다. 

대안 1 : 모바일일 경우 Ext의 그리드를 override하여 터치모드로 작동되도록 변형할 수 있다.
           아래 링크를 통해 확인 할 수 있다. 아래 링크를 갤탭에서 실행하면 터치기능이 작동된다.
http://www.rahulsingla.com/sites/default/files/content/blog/extjs-iscroll/scrolling-ext-containers-on-touch-devices.htm
          소스를 잠깐 보면 Panel, Tree, Grid를 override하고 있다. 이렇게 되면 공통 js에 아래코드를 넣고 사용한다면
           모든 프로그램에 아래 내용이 적용되어 모바일에서는 자동으로 좌우스크롤이 생성되고 터치 기능으로 작동이 가능하다.
           직접 실행해보면 상당히 괜찮을 결과를 얻을 수 있다. 이는 모바일에서 사용되는 iScroll모듈을 Extjs에 적용한 것이다.
           인도 친구 인것 같은데 아이디어가 좋은 것 같다. 그러나 문제가 한가지 있다. 우리 시스템은 ExtJs4기반이고 아래
           소스는 Extjs3버전이다. 그래서 마이그레이션해서 버전을 올려보려 했으나 결정적으로 아래소스에서 보듣이
           Extjs3버전에서는 스크롤의 아이디가 '.x-grid3-scroller'로 정해져 있으나 ExtJS4에서는 이부분이 AutoId로 되어 있어
           스크롤 영역을 특정짓지 못하게 된다. 결국 삽질을 거듭하다 포기하고 다른 대안을 찾도록 했다.
			Ext.isiPad = navigator.userAgent.match(/iPad/i) != null;
			Ext.isiPhone = navigator.userAgent.match(/iPhone/i) != null;
			//TODO: Add support for more devices like Android etc. here.
			Ext.isMobileDevice = Ext.isiPad || Ext.isiPhone;

			///////////////////////////////////////////////////////////
			//iScroll Overrides
			Ext.override(Ext.Panel, {
				afterRender: Ext.Panel.prototype.afterRender.createSequence(function() {
					if (this.getXType() == 'panel') {
						this._getIScrollElement = function() {
							return (this.el.child('.x-panel-body', true));
						}
					}

					//Uncomment below to use iScroll only on mobile devices but use regular scrolling on PCs.
					if (this.autoScroll /*&& Ext.isMobileDevice*/) {
						if (this._getIScrollElement) {
							this._updateIScroll();
							this.on('afterlayout', this._updateIScroll);
						}
					}
				}),

				_ensureIScroll: function() {
					if (!this.iScroll) {
						var el = this._getIScrollElement();
						if (el.children.length > 0) {
							this.iScroll = new iScroll(el);
							this.iScrollTask = new Ext.util.DelayedTask(this._refreshIScroll, this);
						}
					}
				},

				_updateIScroll: function() {
					this._ensureIScroll();
					if (this.iScroll) {
						this.iScrollTask.delay(1000);
					}
				},

				_refreshIScroll: function() {
					this.iScroll.refresh();
					//Refresh one more time.
					this.iScrollTask.delay(1000);
				}
			});

			Ext.override(Ext.tree.TreePanel, {
				_getIScrollElement: function() {
					return (this.el.child('.x-panel-body', true));
				}
			});

			Ext.override(Ext.grid.GridPanel, {
				_getIScrollElement: function() {  // 아래 부분이 Extjs에서 그리드위에 생성되는 스크롤이다. 
					return (this.el.child('.x-grid3-scroller', true)); // 이부분이 스크롤 된다.
				},

				afterRender: Ext.grid.GridPanel.prototype.afterRender.createSequence(function() {
					//TODO: need to hook into more events and to update iScroll.
					this.view.on('refresh', this._updateIScroll, this);
				})
			});


대안 2 : 최초 고객은 두손가락 스크롤을 원했다. 즉 패드종류에서는 기존의 스크롤 대신 두 손가락으로 슬적 밀면 스크롤이 되도록
            지원하고 있다. 개인적으로 절대 이 기능으로 실사용자들이 만족하지 못할 거라는 판단하에 이부분을 첨부터 알아보지
            않고 대안1에 치중하였으나 대안1이 어려우니 이거라도 구현해주려고 한다.
            일단 이 것이 가능하려면 약간 수정 해줘야 한다. 아래의 autoScroll부분이 true일 경우 모바일에서 두손가락 스크롤이
            가능하다.
    createGridPanel: function(){
        this.gridPanel = Ext.create('widget.EmStock.gridPanel', {
            region: 'center',
            store : this.store,
            pageSessionId : this.pageSessionId,
            floatable: false,
            defaults:{ autoScroll:Ext.isiPad || Ext.isiPhone },  // 이 부분이 꼭 필요하다. 패드나 폰일 경우 true를 리턴한다. 갤탭일 경우 그냥 true
            padding: '10 0 0 0',
            totalCount : this.totalCount, 
            split: 	true,
            listeners: {
                scope: this,
                ongridselect: this.onGridSelect,
                columnhide : this.onColumnHide,
                refreshgrid : this.refreshGrid
            }
        });
        
        return this.gridPanel;
    },

'자바스크립트 > Ext JS' 카테고리의 다른 글

[ExtJS4] Gestting Started  (0) 2011.12.22
ExtJS 기반 시스템 구성도  (2) 2011.10.05
Extjs AutoID  (0) 2011.08.13
store에 object 삽입  (0) 2011.08.10
extjs4 무한 스크롤 (infinite scroll)  (0) 2011.08.07
Posted by 베니94
자바스크립트/Ext JS2011. 8. 13. 00:26

getAutoId: function() {
        return ++Ext.AbstractComponent.AUTO_ID;
    },

'자바스크립트 > Ext JS' 카테고리의 다른 글

ExtJS 기반 시스템 구성도  (2) 2011.10.05
ExtJS4 모바일 스크롤 문제 해결  (1) 2011.10.04
store에 object 삽입  (0) 2011.08.10
extjs4 무한 스크롤 (infinite scroll)  (0) 2011.08.07
Event Observer  (0) 2011.07.17
Posted by 베니94
자바스크립트/Ext JS2011. 8. 10. 14:35


// Create a record instance through the ModelManager
                var r = Ext.ModelManager.create({
                    name: 'New Guy',
                    email: 'new@sencha-test.com',
                    start: new Date(),
                    salary: 50000,
                    active: true
                }, 'Employee');

                store.insert(0, r);

'자바스크립트 > Ext JS' 카테고리의 다른 글

ExtJS4 모바일 스크롤 문제 해결  (1) 2011.10.04
Extjs AutoID  (0) 2011.08.13
extjs4 무한 스크롤 (infinite scroll)  (0) 2011.08.07
Event Observer  (0) 2011.07.17
property.Grid에 사용자 콤보 추가.  (2) 2011.07.06
Posted by 베니94
자바스크립트/Ext JS2011. 8. 7. 21:20
그리드는 일반적으로 웹에서 표현될 때 페이징이 되어 보여진다. 그러나 웹인데도 불구하고 대량에 데이터를 보여줘야할
경우가 있다. 일단 2천~3천건 정도를 보여줘야할 경우가 있는데 페이징을 고객이 꺼려한다.
출력은 되지만 천건 이상 출력될 경우 화면 전환이나 이동, 리사이징 등이 당연히 느려질 수 밖에 없다.
그래서 infinite scroll(무한 스크롤을 사용하기로 했다.)
근데 이놈이 문제가 좀 있다. 샘플을 그대로 사용하기에는 문제가있었다. 검색 버튼을 클릭하고 2번째 검색을 다시 했을 경우
스크롤이 정상적인 위치에 있지 않고 그리드내의 페이지 위치와 스크롤 위치가 어긋나는 현상이 발생한다.

이걸 어떻게 맞춰줄 까 싶어 구글링 해보니 방법을 찾았다. 아래의 글을 참고해서 override한 클래스를 이용하면
http://www.sencha.com/forum/showthread.php?133337-desire-to-reload-the-buffered-scrolling-example-with-different-data-via-user-action&p=602983

재 검색시 스크롤 바를 맨 위로 맞춰주게 된다. 더 구체적으로 쓰고 싶지만 나중에 정리하자.




위의 그림을 보면 스크롤을 계속하면 페이지별로 서버에 요청하는 것을 볼 수 있다. 근데 단점은 전체 데이터를 모두 가지고 있으면
로컬 소팅이나 로컬 검색이 가능하지만 이 경우에는 컬럼을 클릭해서 소팅을 다시 할 경우 로컬 소트가 아닌 리모트 소트를 적용
해서 다시 데이터를 원천적으로 해야한 다는 건데..
암튼 이런 형태로 구현하면 눈속임이지만 수만건의 데이터도 보여지게 할 수 있다.

'자바스크립트 > Ext JS' 카테고리의 다른 글

Extjs AutoID  (0) 2011.08.13
store에 object 삽입  (0) 2011.08.10
Event Observer  (0) 2011.07.17
property.Grid에 사용자 콤보 추가.  (2) 2011.07.06
reconfigure  (0) 2011.07.06
Posted by 베니94
자바스크립트/Ext JS2011. 7. 17. 13:18

function captureEvents(observable) {
    Ext.util.Observable.capture(
        observable,
        function(eventName) {
            console.info('event :::',eventName, observable);
        },
        this
    );  
}

captureEvents("감시할 대상");

'자바스크립트 > Ext JS' 카테고리의 다른 글

store에 object 삽입  (0) 2011.08.10
extjs4 무한 스크롤 (infinite scroll)  (0) 2011.08.07
property.Grid에 사용자 콤보 추가.  (2) 2011.07.06
reconfigure  (0) 2011.07.06
Ext 3 to 4 Migration  (0) 2011.07.04
Posted by 베니94
자바스크립트/Ext JS2011. 7. 6. 16:53
Ext.require([
		'Ext.button.Button',
		'Ext.grid.property.Grid'
	]);
	
	Ext.onReady(function(){
		// simulate updating the grid data via a button click
		
		var Unit = Ext.create('Ext.data.Store', {
			fields: ['abbr', 'name'],
				data : [
					{"abbr":"AUstralian", "name":"AUD"},
					{"abbr":"Canadian", "name":"CND"},
					{"abbr":"Europe", "name":"EUR"},
					{"abbr":"british", "name":"GBP"},
					{"abbr":"indian", "name":"INR"},
					{"abbr":"united", "name":"USD"}
				]
			});
		
		var Scale = Ext.create('Ext.data.Store', {
			fields: ['abbr', 'name'],
				data : [
				{"abbr":"AUstralian", "name":"actual"},
				{"abbr":"Canadian", "name":"crore"},
				{"abbr":"Europe", "name":"hundred"},
				{"abbr":"british", "name":"lakh"},
				{"abbr":"indian", "name":"million"},
				{"abbr":"united", "name":"thousand"}
				]
			});
		
		var propsGrid = Ext.create('Ext.grid.property.Grid', {
			width: 300,
			renderTo: 'smpl',
			customEditors: {
				Unit: Ext.create('Ext.form.ComboBox', {                       
					store: Unit,
					queryMode: 'local',
					displayField: 'name',
					valueField: 'abbr',
					editable: false
				}),
				Scale: Ext.create('Ext.form.ComboBox', {                                         
					store: Scale,
					queryMode: 'local',
					displayField: 'name',
					valueField: 'abbr',
					editable: false
				})
			},
			source: {
				"Name": "Properties Grid",
				"(ID)": 'id',
				"Type": true,
				"SubGroup": false,
				"PeriodType": Ext.Date.parse('10/15/2006', 'm/d/Y'),
				"Balance": false,
				"abstract": 0.01,
				"Nullable": 1,
				"Unit": 'USD',
				"Scale":'actual'
			}
		});
	});

'자바스크립트 > Ext JS' 카테고리의 다른 글

extjs4 무한 스크롤 (infinite scroll)  (0) 2011.08.07
Event Observer  (0) 2011.07.17
reconfigure  (0) 2011.07.06
Ext 3 to 4 Migration  (0) 2011.07.04
경고창에 이벤트 주기  (0) 2011.07.01
Posted by 베니94