자바스크립트/Ext JS2012. 1. 25. 00:05

오늘은 히스토리 Api에 대해 알아보겠습니다.
Doc App을 분석하다보니 History가 중요한 역할을 하고 있습니다.

예제를 통해 알아 보겠습니다.

    

    
// app.js
Ext.onReady(function() {
    Ext.History.init();
    var tokenDelimiter = ':';
    
    function onAfterRender() {
    	for(var i=0; i<10; i++){
//    	 Ext.util.History.add(i)
    	 Ext.History.add(i);	
    	}
    }
    
    Ext.create('Ext.TabPanel', {
        renderTo: Ext.getBody(),
        id: 'main-tabs',
        height: 300,
        width: 600,
        activeTab: 0,
        defaults: {
            padding: 10
        },
        
        items: [
        {
            title: 'Tab 1',
            id: 'tab1',
            html: 'Tab 1 content'
        },{
            title: 'Tab 2',
            id: 'tab2',
            html: 'Tab 2 content'
        },{
            title: 'Tab 3',
            id: 'tab3',
            html: 'Tab 3 content'
        },{
            title: 'Tab 4',
            id: 'tab4',
            html: 'Tab 4 content'
        },{
            title: 'Tab 5',
            id: 'tab5',
            html: 'Tab 5 content'
        }],
        listeners: {
            afterrender: onAfterRender 
        }
    });
});

 
브라우저 "뒤로가기"버튼을 클릭 해보면 주소창의 #9가 0까지 변하는 것을 볼 수 있다. Ext.History.add(i) 이 부분을 실행 할 때 마다 브라우저에 #으로 add의 인자가 표시되는 것을 알 수 있다.


이제 코드를 좀 수정해서 ExtJs가 History가 변경되었을 경우를 모니터링 해봅니다.

    function onAfterRender() {
    	 Ext.History.on('change', function(token) {	// history 가 변경되었을 경우 감시할 리스너
    		 console.log(token);
    	 });
    	for(var i=0; i<10; i++){
//    	 Ext.util.History.add(i)
    	 Ext.History.add(i);	
    	}
    }

브라우저를 통해 실행 해 봅니다. 뒤로가기 버튼을 클릭해서 console에 숫자가 찍히는지 확인 합니다. 이를 통해 extjs가 히스토리 객체에 특정 텍스트를 넣고 브라우저의 뒤로가기 버튼을 클릭하면 변경된 히스토리를 감시 할 수 있습니다.


다시 소스를 수정합니다. 이번에는 히스토리에 위의 그림에서 보이는 5개의 탭아이디를 저장하고 뒤로가기 버튼을 클릭해서 각 탭이 선택되도록 해보겠습니다. 사용자가 클릭하지 않고 히스토리를 통해 UI를 조정하는 것입니다.
    function onAfterRender() {
    	 Ext.History.on('change', function(token) {	// history 가 변경되었을 경우 감시할 리스너
    		 console.log('History id ', token);
    		 Ext.getCmp('main-tabs').setActiveTab(Ext.getCmp(token));	// history값으로 탭이 선택되도록
    	 });
    	for(var i=0; i<5; i++){
//    	 Ext.util.History.add(i)
    	 Ext.History.add('tab'+(i+1));	// 아래쪽 탭들의 아이디와 매칭되도록 
    	}
    }
1

아래 그림처럼 뒤로가기 앞으로가기 버튼을 클릭할 때 마다 해당 히스토리에 맞게 탭에 활성화 되는 것을 확인 할 수 있습니다.


이제 좀 다르게 html에 링크를 만들고 해당 링크를 통해 탭을 활성화 해보겠습니다. href="#tab1"과 같이 코딩하고 클릭하면 해당 탭이 활성화 됩니다.
   
    

tab1


tab2


tab3


tab4


tab5




이런 식으로 히스토리에 UI의 아이디 등을 저장하고 사용자가 뒤로가기 또는 앞으로 가기 버튼을 클릭하면 ExtJS는 히스토리
변화를 감지하고 변경되었을 경우 해당 로직대로 화면을 보여줄 수 있도록 코딩하면 될 듯 싶습니다.
Posted by 베니94
자바스크립트/Ext JS2012. 1. 4. 17:08
이제 CSS를 적용해 봅니다. 우선 상단 전체에 백그라운드로 적용 된 CSS를 찾아보자. Docs.view.Viewport 클래스에 region:'north'영역의 아이디가 'north-region'으로 되어 있늘 걸 보면 동일한 이름의 CSS가 이 프로그램이 사용하고 있는 docs/resources/css/app.css에 있는지 확인합니다. 아래 그림처럼 north-region이름으로 css가 존재합니다.


index.html에 위의 css를 넣어 봅니다.

	
파이어폭스를 통해 해당 north-region이 어디인지 확인 해봅니다.


소스가 수정되었다면 다시 실행해서 css가 적용되었는지 확인합니다.


이제 상단 좌측의 docheader클래스의 영역의 css를 적용해 보자. docheader클래스는 index.html내부의 div 중 'header-content'를 contentEl로 삽입하고 있다 아마도 header-content라는 이름으로 app.css에 css가 존재할 것이다.

Ext.define("Docs.view.Viewport", {
..
..
    initComponent: function () {
    	this.items = [{
    		region: "north",
            id: "north-region",
            style: {borderColor:'#000000', borderStyle:'solid', borderWidth:'1px'},
            title: "north-region",
            height: 65,
            layout: {
                type: "vbox",
                align: "stretch"
            },
            items: [{
                height: 37,
                xtype: "container",
                layout: "hbox",
                items: [{
                	xtype: "docheader",
                	style: {borderColor:'#000000', borderStyle:'solid', borderWidth:'1px'}
                }, {
..

Ext.define("Docs.view.Header", {
    extend: "Ext.container.Container",
    alias: "widget.docheader",
    contentEl: "header-content", // index.html 내부의 header-content div를 현 클래스에 삽입.



index.html에 위의 css를 카피해 넣습니다.


// index.html
	


다시 실행해서 확인해보면 아래 그림처럼 좌측 상단에 로고에 선명하게 css가 적용된 것을 확인 할 수 있다.




상단 탭에 대한 css를 적용합니다. 이전에서 app/controller/Tabs에서 welcome, class 를 탭에 추가하는 코딩을 하였습니다. 해서 이미 보이지는 않지만 탭은 구성이 되어 있습니다. css만 추가하면 화면에 탭이 보여지게 될것 입니다. app.css에서 doctab이라는 이름으로 css를 검색해서 index.html에 추가합니다. 이 때 이미지의 경로는 좀 변경해줘야 합니다. app.css가 있던 위치가 달라졌으므로 index.html기준으로 resourcess/images/xxx.png 이렇게 말입니다.

	


상단 탭에 대한 css가 적용되었습니다..



Posted by 베니94
자바스크립트/Ext JS2012. 1. 2. 21:27

이전 시간까지의 결과를 실행해 보면 크게 달라진것이 없습니다. 이제 탭이 doctab영역에 보여지도록 해보겠습니다.
Docs.Application 클래스에 3개의 컨트롤러를 등록 하였습니다. 이 중에서 Tabs만 onLaunch가 구현되어 있습니다. onLaunch메소드는 init메소드와 동일하지만 조금 다른 듯합니다. 어찌되었든 init메소드가 호출되고 그 다음 onLaunch메소드가 호출되고 있습니다. Tabs 컨트롤러를 봅시다.
Ext.define("Docs.controller.Tabs", {
...    
	refs: [{        
		ref: "doctabs",		// this.getDoctabs()로 접근이 가능하다. 하단에서.        
		selector: "#doctabs"    
	},{        
		ref: "welcomeIndex",	// this.getWelcomeIndex()로 접근      
	  	selector: "#welcomeindex"    
	}, {      
	  	ref: "classIndex",		// this.getClassIndex()로 접근        
		selector: "#classindex"    
	}]
....    
	onLaunch: function () { 	// init 이 후 호출    	
		this.getDoctabs().setStaticTabs(Ext.Array.filter([	    											
							this.getWelcomeIndex().getTab(),     											
							this.getClassIndex().getTab()],     											
				function (a) {            
					a       
 				}
 		));    
 	}

onLaunch메소드 내부의 this.getWelcomeIndex().getTab()로 접근이 가능한 것은 ref로 참조를 하고 있기 때문이다. 아래 처럼 말이죠
// app/view/welcome/Index.js  
     getTab: function () {
        return this.hasContent ? {
            cls: "index",
            href: "#",
            tooltip: "Home"
        } : false
    }
 
Tab Controller가 하는 역할은 각각의 view를 탭에 표현되도록 하는 것입니다. 위의 onLaunch의 this.getDoctabs().setStaticTabs()는 Doc.view.Tabs 클래스의 함수입니다. 해당 클래스의 init와 setStaticTabs함수를 아래와 같이 구현해야한다..
    
    initComponent: function () {	
    	// XTemplate을 통해 루프돌며 탭을 보여질 수 있도록 구성해놓는다.
    	this.tpl = Ext.create("Ext.XTemplate", '', 
    						'
', '
', '', '
', "
", "
", '
 
', '
'); this.html = this.tpl.applyTemplate(this.staticTabs); this.tabTpl = Ext.create("Ext.XTemplate", '
', '
', '
', ' ', '{text}', "
", '', "
"); this.callParent() }, setStaticTabs: function (b) { console.log(b); this.staticTabs = b; this.refresh() }, refresh: function () { var i = this.tpl.applyTemplate(this.staticTabs); var f = this.maxTabsInBar() < this.tabs.length ? this.maxTabsInBar() : this.tabs.length; this.tabsInBar = this.tabs.slice(0, f); for (var j = 0; j < f; j++) { var h = this.tabCache[this.tabs[j]]; var g = Ext.apply(h, { visible: true, active: this.activeTab === h.href, width: this.tabWidth() }); i += this.tabTpl.applyTemplate(g) } this.el.dom.innerHTML = i; if (this.activeTab && this.activeTab !== this.tabs[f - 1]) { this.activateTab(this.activeTab); Docs.History.push(this.activeTab) } //this.highlightOverviewTab(this.activeTab); //this.createOverflow(); //this.addToolTips() },
이제 실행하면 아래와 같은 화면을 볼수 있습니다. 별로 변한건 없고 좌측 "탭영역"이라는 문구가 사라졌습니다. 아마도 css가 없으니 탭이 제대로 보여지지 않는것 같습니다.
Posted by 베니94