자바스크립트/Ext JS2013. 10. 13. 15:09

시스템 뼈대 구현하기

 

이번 강좌부터 3회에 걸쳐 ExtJS MVC를 통해 게시판을 구현해보기로 하자. 금번 강좌에서는 게시판이 들어갈 애플리케이션의 뼈대를 만들고 이를 통해 MVC를 적용하는 방법을 같이 배우게 된다. 굳이 게시판을 만드는 이유는 웹애플리케이션에서 게시판이 가지고 있는 의미가 CRUD성격을 모두 지니고 있고 모든 웹개발자들이 만들어봐야 하는 기본 애플리케이션으로 주제에 대한 공통적인 이슈가 모두 공유되어 있다고 믿기 때문이다.

이전 시간에 우리는 Sencha CMD를 통해 애플리케이션을 생성하고 빌드하는 방법을 배웠다. 또한 내장된 웹서버를 이용 개발된 애플리케이션을 실행해보았다. 우리가 만들 게시판은 서버코드가 필요하고 데이터베이스가 필요하므로 개발툴을 에디터에서 이클립스로 바꿀 필요가 있다. 이번 강좌에서는 이전시간에 만들었던 MyMvc애플리케이션을 이클립스의 Dynamic Web Project와 함께 묶어 차후에 있을 서버코드 구현에 대비하도록 하자.

우선 그림1과 같이 이클립스 Dynamic Web Project를 생성하고 프로젝트 설정에서 Text file encoding을 EUC_KR에서 UTF-8로 변경하자.

<그림1> 이클립스 프로젝트 설정

 

필자는 MasoExtJSLecture라는 이름의 프로젝트를 생성하였다. 이제 Sencha CMD를 통해 Extjs 애플리케이션을 생성하자. 이클립스 프로젝트와 맞추려면 WebContent폴더에 ExtJS애플리케이션을 생성하도록 하자. 애플리케이션 생성 코드는 아래와 같다.

sencha -sdk C:\Sencha\ext-4.2.1.883 generate app MyMvc C:\이클립스프로젝트\WebContent

 

정상적으로 애플리케이션이 생성되면 이클립스에서 해당 프로젝트를 refresh하고 이클립스 톰캣플러그인으로 웹서버를 실행한다. 브라우저를 통해 실행하면 이전 강의에서 보았듯이 기본 어플리케이션이 그림2와 같이 실행되는 것을 볼 수 있다.


<그림2> Sencha CMD를 통해 생성된 기본 애플리케이션

 

게시판 애플리케이션은 <그림3>과 같이 상단영역과 좌측 메뉴영역 우측 중앙의 애플리케이션영역으로 나누어 진다.


<그림3> 애플리케이션인 MockUp

 

표1은 뼈대를 이룰 클래스들에 대한 설명이다.

 

클래스명

기능

Model

MyMvc.model.Program

게시판 또는 우측패널에 표시될 애플리케이션의 속성

View

MyMvc.view.WestMenuPanel

좌측에 표시할 게시판그룹

MyMvc.view.WestMenuDataViewPanel

게시판그룹에 해당되는 게시판리스트

MyMvc.view.Header

애플리케이션 상단영역

Controller

MyMvc.controller.Frame

뼈대를 제어할 Controller 클래스

Store

MyMvc.store.Programs

좌측 메뉴에 표시 할 Store

<표1> 클래스 정의

 

MyMvc.view.Viewport.js를 구현하자. Viewport에서는 애플리케이션의 기본 구조를 구성한다.

<리스트1> MyMvc.view.Viewport.js

Ext.define('MyMvc.view.Viewport', {

extend : 'Ext.container.Viewport',

requires : [],

layout : 'border',

items : [ {

    region : 'north',

    xtype : 'container',

    html : '상단영역',

    height : 100,

    style : {

     borderColor : '#000000',

     borderStyle : 'solid',

     borderWidth : '1px'

    }

}, {

    region : 'center',

    xtype : 'tabpanel',

    title : '게시판 프로그램 영역',

    style : {

        borderColor : '#000000',

        borderStyle : 'solid',

        borderWidth : '1px'

    }

}, {

    region : 'west',

    xtype : 'container',

    html : '메뉴 영역',

    width : 200,

    style : {

        borderColor : '#000000',

        borderStyle : 'solid',

        borderWidth : '1px'

    }

} ]

});

 

브라우저를 통해 실행하면 좌측, 상단, 우측으로 영역이 나눠지는 것을 확인 할 것이다.

이제 상단 영역을 구현하자. 상단영역에 해당되는 클래스를 <리스트2>와 같이 코딩하고

Viewport.js의 상단영역을 <리스트2>의 Header클래스로 대체하자.

 

<리스트2> 상단 Header 클래스 및 Viewport클래스 수정

Ext.define('MyMvc.view.Header', {

extend: 'Ext.container.Container',

alias: 'widget.mymvcheader',

id: 'app-header',

height: 52,

layout: {

type: 'hbox',

align: 'middle'

},

initComponent: function() {

this.items = [{

xtype: 'component',

id: 'app-header-title',

html: 'ExtJS MVC를 활용한 게시판 구현하기',

flex: 1

}];

this.callParent();

}

});

// Viewport클래스 기존 상단영역 수정

Ext.define('MyMvc.view.Viewport', {

    extend : 'Ext.container.Viewport',

    requires : [ 'Ext.layout.container.Border', 'MyMvc.view.Header',

            'Ext.tab.Panel' ],

    layout : 'border',

    items : [ {

        region : 'north',

        xtype : 'mymvcheader' // 기존 container

 

상단영역에서 필요한 css를 index.html에 추가하자.

 

<리스트3> 상단영역에서 사용할 index.html 내부 css

<link rel="stylesheet" href="bootstrap.css">

<style type="text/css">

#app-header {

background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #8fc33a), color-stop(100%, #739b2e));

background-image: -webkit-linear-gradient(top, #8fc33a, #739b2e);

background-image: -moz-linear-gradient(top, #8fc33a, #739b2e);             background-image: -o-linear-gradient(top, #8fc33a, #739b2e);

background-image: linear-gradient(top, #8fc33a, #739b2e);

border-bottom: 1px solid #567422;

}

#app-header-title {

padding: 15px 10px 10px 31px;

color: white;

font-size: 18px;

font-weight: bold;

text-shadow: 0 1px 0 #4e691f;

}

</style>

<script src="ext/ext-dev.js"></script>

 

실행하면 <그림4>와 같은 결과를 확인할 수 있다.

 

<그림4> 상단영역을 구현한 결과

 

좌측 메뉴영역을 구현하자. 좌측 메뉴는 2depth로 이루어진다. 게시판그룹을 accordion레이아웃으로 노출하고 클릭 시 세부게시판 리스트를 출력하도록 한다.

게시판그룹을 나타낼 WestMenuPanel클래스를 <리스트4>와 같이 정의하자.

 

<리스트4> 게시판 그룹 클래스

Ext.define('MyMvc.view.WestMenuPanel',{

extend : 'Ext.panel.Panel',

alias : 'widget.westmenupanel',

layout:'accordion',    // ① 레이아웃 설정

collapsible: true,

split:true,

title : 'Forum List',

initComponent: function() {

var me = this;

this.callParent(arguments);

this.on('render', this.setSubMenu, this); // ② render이벤트 발생시 함수 호출

},

// ③ 스토어 호출 후 게시판 그룹을 추가.

setSubMenu: function(){

    var me = this;

    var store = Ext.create('MyMvc.store.Systems');

    store.load(function(record, b, c){                

     store.each(function(rec){

        me.add({

          xtype:'panel',

          title:rec.get('pgm_sysnm'),

          pgm_syscd:rec.get('pgm_syscd'),

          iconCls:rec.get('pgm_sysicon')

         });

     });

    });

}

});

 

주요코드를 설명하자. ①은 게시판그룹을 추가할 때 accordion형태로 추가되도록 레이아웃을 설정한다. ②는 현 클래스에서 render이벤트가 발생시 게시판그룹을 추가할 메소드를 호출한다. ③함수는 게시판그룹 store를 호출하고 자식으로 추가한다.

 

게시판 그룹에 사용할 Model과 Store를 정의하자.

 

<리스트5> MyMvc.model.Program.js

Ext.define('MyMvc.model.Program', {

extend : 'Ext.data.Model',

fields : [ 'pgm_id', 'pgm_nm', 'pgm_syscd', 'pgm_sysnm', 'pgm_class',

    'pgm_icon', 'pgm_sysicon', 'group_id', 'group_nm',

    'group_status_cd', 'group_status_nm', 'group_pgm_status_nm',

    'title', 'brd_number']

});

 

<리스트6> MyMvc.store.Systems.js

Ext.define('MyMvc.store.Systems', {

extend: 'Ext.data.Store',    // 당연히 store상속

autoLoad : false,        // 자동 로드는 꺼놓자.

model: 'MyMvc.model.Program',    // 모델 세팅

proxy: {

type: 'ajax',

// json폴더를 루트에 만들고 systemlist.json이라는 파일를 통해

// 시스템 리스트를 받을 수 있다.

url: '/json/systemlist.json',    

reader: {

    type: 'json',

    root: 'entitys',

    totalProperty: 'totalCount',

    messageProperty: 'message'

},

listeners: {

exception: function(proxy, response, operation){}

    }

}

});

 

<리스트7>/json/systemlist.json

{

    "entitys":[{

        "pgm_syscd":"F001",

        "pgm_sysicon":"grid",

        "pgm_sysnm":"Sencha",

        "title":"Sencha"

    }, {

        "pgm_syscd":"F002",

        "pgm_sysicon":"grid",

        "pgm_sysnm":"사는애기 ",

        "title":"사는애기"

    }, {

        "pgm_syscd":"F003",

        "pgm_sysicon":"grid",

        "pgm_sysnm":"Front End",

        "title":"Front End"

    }],

    "errMsg":"",

    "errTitle":"검색결과",

    "message":"",

    "success":true,

    "totalCount":""

}

 

Viewport.js를 수정하여 <리스트5~7> 코드가 적용되도록 하자.

<리스트8>Viewport.js수정

…중략..

requires : [ 'Ext.layout.container.Border', 'MyMvc.view.Header',

            'Ext.tab.Panel', 'MyMvc.view.WestMenuPanel' ],

..중략..

}, {

    region : 'west',

    xtype : 'westmenupanel',

    width : 200

} ]

결과를 실행하면 <그림5>와 같이 게시판그룹이 출력된다.

<그림5> 좌측 게시판 그룹 구현

 

<그림5>는 accordion레이아웃을 이용하여 panel에 panel을 배치한 것이다. 이제 각 게시판그룹 이하에 중앙패널에 표시할 게시판리스트가 나오도록 구현해 보자.

 

<리스트9> Controller를 Application클래스에 등록

Ext.define('MyMvc.Application', {

    ..중략..

    controllers : [ 'Frame' ],

    ..중략..

});

 

<리스트10> MyMvc.controller.Frame.js 생성

Ext.define('MyMvc.controller.Frame', {

extend: 'Ext.app.Controller',

views: ['MyMvc.view.WestMenuDataViewPanel'],

stores : ['Programs'],

init : function(app) {

    this.control({

    });

}

});

 

<리스트11> MyMvc.store.Programs.js 생성

Ext.define('MyMvc.store.Programs', {

extend : 'Ext.data.Store',

autoLoad : true,

model : 'MyMvc.model.Program',

proxy : {

    type : 'ajax',

    url : '/json/programlist.json',

    reader : {

     type : 'json',

     root : 'entitys',

     totalProperty : 'totalCount',

     messageProperty : 'message'

    },

    listeners : {

     exception : function(proxy, response, operation) {

     }

    }

},

filterUsersByDepartment : function(pgm_syscd) {

    this.clearFilter();

    this.filter([ {

        property : 'pgm_syscd',

        value : pgm_syscd

    } ]);

},

refresh : function() {

    this.clearFilter();

}

});

 

<리스트12> /json/programlist.json

{"entitys":[

{    "pgm_syscd":"F001","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"ExtJS","brd_number":"001" },

{    "pgm_syscd":"F001","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"Sencha Touch","brd_number":"002" },

{    "pgm_syscd":"F002","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"구인_구직","brd_number":"003" },

{    "pgm_syscd":"F002","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"요즘","brd_number":"004" },

{    "pgm_syscd":"F003","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"jQuery","brd_number":"005" },

{    "pgm_syscd":"F003","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"Javascript","brd_number":"006" }

],

"errMsg":"","errTitle":"검색결과","message":"","success":true,"totalCount":"2"}

 

<리스트13> MyMvc.view.WestMenuDataViewPanel.js

Ext.define('MyMvc.view.WestMenuDataViewPanel', {

extend : 'Ext.panel.Panel',

alias : 'widget.menuboard',

animCollapse : true,

collapsible : true,

collapsed : true,

useArrows : true,

rootVisible : false,

multiSelect : false,

header : {

    toolFirst : true

},

initComponent : function() {

    var me = this;

    this.initConfig(); // 초기화 실행

    Ext.apply(this, {

     items: [{

        xtype: 'dataview',

        store : 'Programs',

        trackOver: true,

        cls: 'feed-list',

        itemSelector: '.feed-list-item',

        overItemCls: 'feed-list-item-hover',

        tpl: '<tpl for="."><div class="feed-list-item {pgm_icon}">{pgm_nm}</div></tpl><p>'

     }]

    });

    this.callParent(arguments);

}

});

 

<리스트13>이 호출 될 수 있도록 게시판그룹을 표현한 WestMenuPanel의 setSubMenu 메소드를 아래와 같이 수정하자.

변경전 : xtype: 'panel' -> 변경후 xtype : 'menuboard'

 

실행 결과를 확인하면 <그림6>와 같이 좌측 게시판 그룹에 게시판 리스트가 추가된 것을 볼 수 있다.

 

<그림6> 좌측 메뉴에 게시판 리스트 추가.

 

각각의 게시판그룹을 클릭해보자. 우리가 구현하고자 하는 것은 게시판 그룹을 클릭 후 해당 게시판 그룹코드(pgm_syscd)와 동일한 코드를 가지고 있는 게시판만 출력되도록 하는 것이다. 현재는 모든 게시판이 보여지고 있으므로 해당그룹에 맞는 게시판을 필터링 하도록 구현해보자.

<리스트14>와 같이 Frame Controller를 수정하여 게시판그룹 패널과 내부 게시판리스트 패널의 이벤트를 리스닝 할 수 있도록 하자.

 

<리스트14> Frame Controller수정

Ext.define('MyMvc.controller.Frame', {

extend : 'Ext.app.Controller',

views : [ 'MyMvc.view.WestMenuDataViewPanel', 'MyMvc.view.WestMenuPanel' ],

stores : [ 'Programs' ],

init : function(app) {

    this.control({

     'westmenupanel > menuboard' : {    // ① 이벤트 리스닝

        afterrender : function(panel){    // ② 최초 발생

         panel.firstSelectDataView();

        },

        expand : function(panel){

         panel.onItemClicked();    // ③ 패널이 열릴때 발생

        }

     }

    });

}

});

 

<리스트14>를 자세히 설명하자. ①은 Controller의 주요 역할인 View의 이벤트를 리스닝하고 있다. westmenupanel(게시판그룹패널) 하위에 존재하는 menuboard(게시판리스트패널)에서 발생하는 이벤트를 리스닝한다.(westmenupane과 menuboard는 위젯명임을 명심하자.)

②는 render가 끝난 후 호출된다. 인자로 menuboard패널이 넘어온다. afterrender이벤트가 발생하면 firstSelectDataView()함수를 호출한다. ③은 패널이 expand(열릴 때) 될 때 onItemClicked()함수를 호출한다.

②, ③에 해당되는 WestMenuDataViewPanel클래스의 메소드를 <리스트15>와 같이 구현하자.

 

<리스트15> WestMenuDataViewPanel의 로직구현

Ext.define('MyMvc.view.WestMenuDataViewPanel', {

.. 중략 ..

// dataview상에 출력된 리스트 중에 맨처음 프로그램이

//          선택되어지도록 한다.

firstSelectDataView : function() {

    var me = this;

    if (me.collapsed)

     return;

 

    var store = this.onItemClicked();

    if (store) {

     var task = new Ext.util.DelayedTask(function() {

        me.down('dataview').getSelectionModel().select(store.getAt(0));

     });

     task.delay(1000);

    }

},

// 시스템 패널을 클릭 할 때 마다 expand이벤트가 호출 된다.

// 이 때 클릭되어 expand된 패널 위에 하위 프로그램을 출력하면 된다.

onItemClicked : function() {

    var me = this;

    if (me.collapsed)

     return // 패널이 접히지 않은 패널을 찾는다.

            

    me.down('dataview').store

    .filterUsersByDepartment(this.pgm_syscd);

    return me.down('dataview').store;

}

});

 

수정된 코드를 실행하고 게시판 그룹을 클릭하면 해당 그룹에 맞는 게시판 리스트가 필터링 되어 보여지는 것을 볼 수 있다. 이는 WestMenuDataViewPanel에 구현된 두 개의 메소드에 의해 작동된다.

firstSelectDataView() 메소드는 게시판리스트를 담고 있는 store의 첫번째 데이터가 select되어지도록 하는 코드이다. onItemClicked() 메소드는 게시판 리스트를 출력하는 dataview가 가지는 store를 통해 해당 게시판 그룹에 맞는 게시판을 필터링 하는 역할을 한다.

메뉴에 들어갈 css를 index.html에 <리스트16>과 같이 추가하고 실행하자.

 

<리스트16> 좌측 메뉴용 css

.feed-list {

padding: 0 3px 0 3px;

}

.feed-list-item {

margin-top: 3px;

font-size: 11px;

line-height: 20px;

cursor: pointer;

border: 1px solid #fff;

}

.feed-list .x-item-selected {

font-weight: bold;

color: #15428B;

background-color: #DFE8F6;

border: 1px dotted #A3BAE9;

}

 

<그림7은> 게시판 그룹별 게시판리스트를 필터링하여 보여주고 있다.

 

<그림7> 게시판 그룹별 필터링 적용 후

 

이번 강좌의 마지막 작업이자 가장 핵심적인 작업이 남아있다. 좌측 메뉴를 구현했고 최초 로딩 시 첫번째 게시판 그룹의 첫번째 게시판이 자동으로 선택되어지게 하였다. 이때 선택되어진 또는 사용자가 선택할 경우 우측에 해당 게시판 애플리케이션을 출력되도록 해야 한다.

 

<리스트17>과 같이 Frame Controller에 코드를 추가하자.

Ext.define('MyMvc.controller.Frame', {

..중략..

Init : function(app){

this.control({

.. 중략 ..

     'menuboard > dataview' : { // 게시판 리스트의 dataview에서 발생한 이벤트

     select : this.onProgramSelect

     }

});

},

onProgramSelect : function(dataview, record) {

    var pgm_class = record.get('pgm_class'), pgm_nm = record.get('pgm_nm');

    var centerpanel = Ext.ComponentQuery

                .query('viewport container[region="center"]')[0];

    var tab = centerpanel.down('[tabuniqid=' + pgm_class + pgm_nm + ']');

    if (!tab) {

     tab = Ext.create(pgm_class, {

        brd_number : record.get('brd_number')

     });

     tab.title = pgm_nm+ "("+record.get('brd_number')+")";

     tab.tabuniqid = pgm_class + pgm_nm;

     centerpanel.add(tab);

    }

    centerpanel.setActiveTab(tab);

}

});

 

<리스트17>에 대해 자세히 설명하겠다. Frame Controller에 새로운 이벤트를 리스닝하도록 코드를 추가하였다. 이 코드는 게시판리스트 패널(WestMenuDataViewPanel) 내부의 dataview에서 select이벤트가 발생하면 onProgramSelect()메소드를 호출하도록 했다. onProgramSelect()메소드는 select이벤트 발생시 전달받은 게시판정보를 이용해 애플리케이션 중앙의 탭패널에 자식으로 게시판 클래스 인스턴스를 생성하여 추가하는 로직이다.

programlist.json파일을 상기시켜보자 아래와 같이 pgm_class에 일괄적으로 Ext.panel.Panel클래스가 들어 가있다. 이것은 아직 구현되지 않은 게시판 클래스 대신 Panel클래스를 넣어둔 것이다. 이러한 형태는 이후 게시판 뿐만 아니라 새로 개발된 어떤 클래스도 중앙패널에 추가할 수 있다는 것을 의미한다.

"pgm_syscd":"F001","pgm_class":"Ext.panel.Panel","pgm_icon":"grid","pgm_nm":"ExtJS","brd_number":"001" },

 

최종 실행하면 <그림8>과 같은 결과를 볼 수 있을 것이다.

<그림8> 최종 구현된 뼈대의 실행결과

 

정리하며

이번 시간에는 ExtJS의 MVC를 적용하여 애플리케이션의 뼈대를 구현해보았다. 이러한 뼈대는 향후 게시판 뿐만 아니라 어떤 어플리케이션도 배치할 수 있는 좋은 구조라 할 수 있겠다.

Posted by 1 베니94

댓글을 달아 주세요

  1. 블루스톰

    ^^ 강의 잘보았습니다~ 질문있는데요~ 컨트롤에 'menuboard > dataview' : 이부분이... 처음 한번만 동작하고 먹통이네요... 계속 이벤트를 감지해야할 것 같은데... 이벤트감지가.. 안되네요~ ^^;;; 소스코드는 강의와 똑같습니다.. 어떤 부분을 빼먹은건지.. 확인할 방법이 있나요?

    2013.12.28 18:37 [ ADDR : EDIT/ DEL : REPLY ]
    • 오류 등이 없는지 콘솔을 확인해보시기 바랍니다.
      그리고 select이벤트는 itemclick이벤트와 달리 한번 클릭한 곳을
      또 클릭하면 이벤트가 발생하지 않습니다.
      이벤트가 호출이 안되는 것인지 호출된 이후 메소드가
      처리를 못하는 것인지 확인해야할 듯합니다.

      2014.01.04 02:57 신고 [ ADDR : EDIT/ DEL ]
  2. 제니

    좋은 강의 정말 감사합니다~

    저도 블루스톰님과 똑같은 상태네요.

    처음 시작할때만 이벤트가 발생해서 center에 ExtJs(001)이라는 탭이 생성된 후에

    다른 dataview를 눌러보아도 이벤트 리스닝을 하지 못하네요 ㅠ ㅠ

    방법이 있을까요 ?

    2014.01.06 01:04 [ ADDR : EDIT/ DEL : REPLY ]
  3. 무한상상예찬론자

    우선 바쁘신 와중에 이렇게 좋은 강좌를 만들어 주신 님의 노고에 대단히 감사드립니다.

    사이트를 EXT js로 구축하게 된 상황이라 본 강좌를 통해 많은 도움을 받고 있습니다.

    저 역시 본예제를 똑 같이 해보았으나 위의 블루스톰님, 제니님과 같이 이벤트가 발생하지 않는 상태입니다.

    현재는 센차doc을 보고 어떻게 처리해보려고 하고 있으나 아직 손과 눈에 익지 않아서 인지 잘 안되네요..

    브라우저 특성을 타는건지 해서 크롬, 사파리, 파폭, 오페라, 스윙 모두 테스트 해보았으나

    모두 같이 작동을 안합니다.

    앞서 말씀해 주신 체크 사항 외에 다른 힌트가 있다면 염치 불구하고 부탁드립니다.

    혹 이 강좌를 해보신 분들중에 해결 하신분 있으신 공유 좀 부탁드려요^^;


    아래는 환경을 탈지도 모른다는 생각에 현재 개발환경을 적어보았습니다.
    --------------------------------------------------------------------------------------
    os : win7 64비트
    jdk : 1.7.0.45(32비트)
    ext js : 4.2.1.883
    브라우저 : IE (10.0.0.9200, 32비트), 사파리(5.1.7, 32비트), 크롬(32.0.1700.72 m, 32비트),
    파폭(26, 32비트), 오페라(18.0.1284.68, 32비트), 스윙(1.0.0.4, 32비트)
    --------------------------------------------------------------------------------------

    2014.01.08 14:03 [ ADDR : EDIT/ DEL : REPLY ]
    • 흠.. 별문제가 없는대 말이죠..

      소스를 메일로 보내주시면 확인하겠습니다.

      에러도 없고 그냥 반응이 없는건지 모르겠군요.

      benneykwag@gmail.com으로 소스를 전송해주시면 감사하겠습니다.

      다른 분들도 보내주시면 확인하겠습니다.

      2014.01.08 22:23 신고 [ ADDR : EDIT/ DEL ]
  4. 이 글에서 이벤트가 처음만 작동한다고 하신 분들은 아래 코드를 확인해주세요.
    문제 코드 : "feed-list-item{pgm_icon}" (공백이 없음)
    개선 코드 : "feed-list-item {pgm_icon}" (2개의 스타일클래스가 다르기 때문게 공백으로 떨어트림)

    2014.01.09 22:04 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 제니

      해결되었어요!

      정말 감사합니다 ㅠ ㅠ`

      2014.01.09 23:22 [ ADDR : EDIT/ DEL ]
    • 무한상상예찬론자

      감사합니다^^;

      바쁘신 와중에 소스를 분석해주시고 복 받으실거예요~~!!

      2014.01.10 10:03 [ ADDR : EDIT/ DEL ]
  5. 욕구불만

    안녕하세요 ^^ 이해가 잘 안가서 그러는데 질문 하나만 하겠습니다.

    스토어에서 호출시 코드가

    setSubMenu: function(){
    var me = this;
    var store = Ext.create('MyMvc.store.Systems');
    store.load(function(record, b, c){
    store.each(function(rec){

    이렇게 되는데 이 부분 설명을 해주시면 정말 감사하겠습니다.
    변수 store에 만들어진 객체가 저장되는 것은 알겠는데, 그 다음의 load메소드와 each메소드 부분이 이해가 잘 가지않네요.... 감사합니다

    2014.01.14 01:42 [ ADDR : EDIT/ DEL : REPLY ]
    • benneykwag@gmail.com

      아래코드가 궁금하신 것 같습니다.
      var store = Ext.create('MyMvc.store.Systems');
      store.load(function(record, b, c){
      store.each(function(rec){

      }
      }

      스토어가 로드는 Ajax를 통해 통신이 되기 때문에 로드 이후 시점에
      접근해야 로드결과를 확인할 수 있겠지요.
      해서 store.load메소드를 호출하고 이후 익명함수(콜백)안에서 store변수에 접근하거나 function에 전달되는 인자로 접근하면 데이터가 불러진 상태에서 스토어에 접근하게 되므로 그런 코드가 나오게 됩니다.

      핵심은 스토어 호출이 끝난 시점에 스토어에 접근해야 원하는 데이터를 얻을 수 있겠습니다.
      감사합니다.

      2014.01.24 10:38 [ ADDR : EDIT/ DEL ]
  6. 초보

    아, 제가 ExtJS를 처음 접하면서 화면을 띄우기도 힘들었었는데 여기 글들을 보고 공부할 수 있어서
    너무 좋은것 같습니다!!!정말 친절히 설명과 코멘트 달아주셔서 감사합니다, 기본적인 모든 정보를 공부할 수 있는
    기회인 것 같구, 자주 와서 공부할께요.
    너무너무 감사합니다:D 늦었지만 복 많이받으세요~
    - 오늘부로 팬이된 'Benny' -

    2014.02.28 20:03 [ ADDR : EDIT/ DEL : REPLY ]
  7. 완전왕초보

    ExtJS로 디자인작업을 처음 시작했는데 어디에서도 화면디자인에 대한 정보가없어서
    한달 넘게 고생고생 하고 있습니다.
    여기서 한대로 따라 해보았지만 아예 화면도 못띄우겠네요 ㅠㅠ
    환경설정은 다 해놓아서 간단한 다른 테스트 했을경우는 화면이 띄워지는데
    여기에 레이아웃 나뉘어 나오는 MyMvc.view.WestMenuDataViewPanel.js 화면이 띄워지지 않네요 ㅠㅠ
    어떤게 문제 일까요? ㅠㅠ

    2016.07.19 20:10 [ ADDR : EDIT/ DEL : REPLY ]
  8. 완전왕초보

    제가 띄운 소스는

    Ext.onReady(function(){
    Ext.create('Ext.form.Panel',{
    title:'File',
    renderTo:Ext.getBody(),
    bodyPadding:10,
    //padding값을 주면 아래 두번째 화면 텍스트 보임
    //bodyStyle:{"background-color":"red"},
    width:400,
    height:400,
    items:[
    {
    //파일 업로드
    xtype:'filefield',
    width:300,
    listeners:{
    afterrender:function(cmp){
    cmp.fileInputEl.set({
    multiple:'multiple'
    });
    },
    change:function(){
    var file = Ext.ComponentQuery.query('filefield')[0];
    var files = file.fileInputEl.dom.files;
    var temp = "";
    for(i=0;i<files.length;i++){
    temp=temp+files[i].name+'\n';
    }
    Ext.ComponentQuery.query('textarea[name=filelist]')[0].setValue(temp);
    }
    }
    },{
    xtype:'textarea',
    name:'filelist'
    },{
    xtype:'button',
    text:'Submit',
    handler:function(){
    var form = this.up('form').getForm();
    form.submit({
    url:'fileupload.jsp',
    waitMsg:'잠시만 기다려주세요.',
    success:function(fp, o){
    //성공
    }
    });
    }
    }]
    });
    });


    이렇게 하면 띄워지는데 여기에 나와있는 소스로
    Ext.define('MyMvc.view.WestMenuDataViewPanel', {
    extend : 'Ext.panel.Panel',
    alias : 'widget.menuboard',
    animCollapse : true,
    collapsible : true,
    collapsed : true,
    useArrows : true,
    rootVisible : false,
    multiSelect : false,
    header : {
    toolFirst : true
    },
    initComponent : function() {
    var me = this;
    this.initConfig(); // 초기화 실행
    Ext.apply(this, {
    items: [{
    xtype: 'dataview',
    store : 'Programs',
    trackOver: true,
    cls: 'feed-list',
    itemSelector: '.feed-list-item',
    overItemCls: 'feed-list-item-hover',
    tpl: '<tpl for="."><div class="feed-list-item {pgm_icon}">{pgm_nm}</div></tpl><p>'
    }]
    });
    this.callParent(arguments);
    }
    });
    이렇게 하면 화면이 하얗게만 보입니다. ㅠㅠ

    2016.07.19 20:12 [ ADDR : EDIT/ DEL : REPLY ]
  9. 서영

    ExtJS 6 삽질중입니다.
    UI 디자인작업을 ExtJS로 하려고 하니
    한달내내 시간만 가고 있네요
    여기저기 검색하다 들어왔어요
    자료도 없고 책도 마땅한게 없어서 계속 고민중입니다.
    혹시저에게 알려줄 정보 있으시면 부탁좀 드릴께요
    Ext.define으로 js구현해주면
    불러들이는 소스가 있어야 화면이 보여지나요?
    Ext.define만으로는 화면이 하얗게 보여지네요 ㅠㅠ

    2016.07.25 14:56 [ ADDR : EDIT/ DEL : REPLY ]