템플릿

webPonent Grid 2.0 Template

그리드에서는 그리드의 레이아웃, 데이터 바인딩을 위해 template이라는 개념을 도입했습니다.

템플릿은 그리드의 각종 모델들을 구축하는 기반이 됩니다. 그럼 template에 세팅되는 각종 속성들에 대해 알아봅시다.

15px2

Template의 기본 형태

템플릿에 작성되어있는 thead와 tbody의 자식들은 그대로 복사되어 그리드의 레이아웃을 그리게 됩니다. 예들 들어 THEAD에 TR들이 복잡하게 colspan, rowspan되어있으면 실제 그리드에도 똑같은 모양으로 나타나게 됩니다.

그리고 템플릿을 이루게 되는 TH와 TD에는 name속성과 bind속성이 필수로 적혀야 합니다.

  • name속성은 THEAD에 있는 셀(TH또는 TD)들과 TBODY에 있는 셀들을 매칭 시켜줍니다. 소팅이나 필터링을 했을때 매칭되는 셀들이 동작합니다.
  • bind속성은 TBODY에 TR들이 렌더링될때 데이터 (DOM, ARRAY, MAP)의 키 값을 의미합니다. 렌더링후에 그리드에서 데이터를 가져올때 해당 키로 손쉽게 데이터를 가져올 수 있습니다.

 

기본 템플릿 구조xml
	<script id="ci-grid-template" type="text/template">
		<table>
			<thead>
				<tr>
					<th name="id" >ID</th>
					<th name="user_name">USER NAME</th>
					<th name="password">PASSWORD</th>
					<th name="gender">GENDER</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td name="id" bind="id" ></td>
					<td name="user_name" bind="user_name" ></td>
					<td name="password" bind="password" ></td>
					<td name="gender" bind="gender" ></td>
				</tr>
			</tbody>
		</table>
	</script>

bind속성에 대하여

bind속성은 그리드 데이터 모델의 핵심이 되는 값 입니다. bind속성에 정의한 값을 기준으로 데이터는 Array<Map>형태로 저장됩니다. 혹은  Array<Map>에서 꺼내서 해당 노드의 text값을 바꿉니다.

예들들어 다음과 같은 HTML노드를 데이터로 사용했을때에는

				<tr>
		            <td>1</td>
		            <td>areynolds</td>
		            <td>pYhuzU</td>
		            <td>Male</td>
		        </tr>
		        <tr>
		            <td>2</td>
		            <td>egeorge</td>
		            <td>i0X0x4</td>
		            <td>Female</td>
		        </tr>
		        <tr>
		            <td>3</td>
		            <td>jellis</td>
		            <td>tQWflr38bCS</td>
		            <td>Female</td>
		        </tr>
		        <tr>
		            <td>4</td>
		            <td>mbutler</td>
		            <td>FuzZU1FX56</td>
		            <td>Female</td>
		        </tr>

템플릿에 있는CELL의 순서와 데이터로 들어온 HTML의 셀을 순서로 비교하여 그리드의 데이터 모델이 다음과 같이 세팅됩니다.

[
  {
    "id": "1",
    "user_name": "areynolds",
    "password": "pYhuzU",
    "gender": "Male"
  },
  {
    "id": "2",
    "user_name": "egeorge",
    "password": "i0X0x4",
    "gender": "Female"
  },
  {
    "id": "3",
    "user_name": "jellis",
    "password": "tQWflr38bCS",
    "gender": "Female"
  },
  {
    "id": "4",
    "user_name": "mbutler",
    "password": "FuzZU1FX56",
    "gender": "Female"
  }
]] ]>

테이블이 세팅되어있지않구 JSON데이터를 기반으로 데이터를 넣을때는 반대의 과정이 일어납니다.

bind속성과 데이터 모델은 밀접한 관계가 있어서, 자세한 내용은 데이터 모델편에서 설명하겠습니다.

SCRIPT Template VS HTML Template

 대다수의 예제는 script태그안에 template을 정의하고, table태그에 테이블을 정의했습니다. 하지만 실제로는 꼭 script태그를 이용해서 template을 정의할 필요는 없습니다. script태그를 사용하면 기본적으로 display:none속성이있다는점과, 브라우저가 렌더링시 이 태그를 무시해, 조금이라도 렌더링성능이 향상되는 장점이 있습니다.

 다음은 여러가지 방식으로 테이블과 템플릿을 정의하는 예제입니다.

HTML 테이블 + SCRIPT 템플릿xml
<table id="ci-grid">
	   
</table>

<script id="ci-grid-template" type="text/template">
	<table>
		<thead>
			<tr>
				<th name="id" >ID</th>
				<th name="user_name">USER NAME</th>
				<th name="password">PASSWORD</th>
				<th name="gender">GENDER</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td name="id" bind="id" ></td>
				<td name="user_name" bind="user_name" ></td>
				<td name="password" bind="password" ></td>
				<td name="gender" bind="gender" ></td>
			</tr>
		</tbody>
	</table>
</script>
 
<script>
	var table = $('#ci-grid');
	var template = $('#ci-grid-template');
 
	var grid = webponent.grid.init(table, template);
</script>

에디터들의 한계상 script태그내에 템플릿을 편집하기 힘들지만 가장 추천하는 방법입니다. ^^

 

HTML테이블 + HTML템플릿xml
<div id="ci-grid">
	   
</div>

<div id="ci-grid-template" style="display:none;">
	<table>
		<thead>
			<tr>
				<th name="id" >ID</th>
				<th name="user_name">USER NAME</th>
				<th name="password">PASSWORD</th>
				<th name="gender">GENDER</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td name="id" bind="id" ></td>
				<td name="user_name" bind="user_name" ></td>
				<td name="password" bind="password" ></td>
				<td name="gender" bind="gender" ></td>
			</tr>
		</tbody>
	</table>
</div>


<script>
	var table = $('#ci-grid');
	var template = $('#ci-grid-template');

	var grid = webponent.grid.init(table, template);

</script>

테이블과 템플릿을 감싸는 NODE가 DIV로 바뀌었지만 전혀 문제되지 않습니다.

 

원샷원킬xml
<div id="ci-grid">
	<table>
		<thead>
			<tr>
				<th name="id" >ID</th>
				<th name="user_name">USER NAME</th>
				<th name="password">PASSWORD</th>
				<th name="gender">GENDER</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				<td name="id" bind="id" ></td>
				<td name="user_name" bind="user_name" ></td>
				<td name="password" bind="password" ></td>
				<td name="gender" bind="gender" ></td>
			</tr>
		</tbody>
	</table>
</div>

<script>
	var template = $('#ci-grid');

	var grid = webponent.grid.init(template);

</script>

 template기능의 기본 원리는 template을 복사해서 table부분을 바꿔치는 것 입니다. 그렇기 때문에 위와같이 테이블부분이 템플릿역활도 할 수 있습니다.

 

Template 속성들

템플릿에는 필수 속성인 name, bind외에 그리드 레이아웃을 결정하는 여러가지 속성이 있습니다.

grid width, height

table요소에 width와 height 속성으로 그리드의 가로길이와 세로길이를 설정 할 수 있습니다.

20px

 

400px
Attribute nametypedefault
widthcss string100%
heightcss stringauto
xml
	<table width="600px" height="400px">
		...
	</table>

width

THEAD요소내의 CELL(TH또는 TD)에 width속성을 주어 컬럼의 길이를 세팅할 수 있습니다. width속성을 적어주지 않으면 테이블에서 '*'을 준것과 같습니다.

20px

 

400px
Attribute nametypedefault
widthcss string*
xml
	<table>
		<thead>
			<tr>
				<th name="id" width="70px">id</th>
				<th name="user_name" width="150px">user_name</th>
				<th name="password" width="150px">password</th>
				<th name="gender" width="100px">gender</th>
			</tr>
		</thead>
		...
	</table>
20px

 

컬럼의 Width 설정에 대하여

컬럼의 가로길이는 px, %, *의 세 종류로 세팅 할 수 있습니다.

세종류의 값들을 같이 사용 할 수 있습니다. 세 종류의 값이 같이 설정 되었을때 가로 길이 적용 룰은 다음과 같습니다.
  • px은 정해준 길이로 컬럼이 세팅됩니다.
  • %는 px로 세팅된 컬럼들이 그리드에서 차지하고 남은 공간에서의 100분율로 가로길이가 적용 됩니다.
  • *로 세팅된 컬럼은 위 두세팅 방식이 차지하고 남은 공간에서 N등분을 하여 가로길이가 적용 됩니다.

min-width

이 값이 설정된 컬럼은 해당 길이값 아래로는 길이가 줄어들지 않습니다.

20px

 

400px
Attribute nametypesampledefault
min-widthpx"250px" 
xml
	<table>
		<thead>
			<tr>
				<th name="id" width="70px">id</th>
				<th name="user_name" width="*" min-width="200px">user_name</th>
				<th name="password" width="150px">password</th>
				<th name="gender" width="100px">gender</th>
			</tr>
		</thead>
		...
	</table>

align

THEAD요소내의 CELL(TH또는 TD)에 align속성을 주어 컬럼의 정렬을 세팅할 수 있습니다. 아무것도 적어주지 않으면 left정렬이 됩니다.

20px

 

400px
Attribute nametypedefaultproperties
alignStringleftleft | center | right
xml
	<table>
		<thead>
			<tr>
				<th name="id" align="center">id</th>
				<th name="user_name" align="center">user_name</th>
				<th name="password" align="center">password</th>
				<th name="gender" align="right">gender</th>
			</tr>
		</thead>
		...
	</table>

visibility

THEAD요소내의 CELL(TH또는 TD)에 visibility속성을 주어 컬럼의 보임/숨김을 세팅할 수 있습니다. hidden값을 세팅하여 컬럼을 숨길 수 있습니다.

20px

 

400px
Attribute nametypedefaultproperties
visibilityStringvisiblevisible | hidden
xml
	<table>
		<thead>
			<tr>
				<th name="id">id</th>
				<th name="user_name">user_name</th>
				<th name="password" visibility="hidden">password</th>
				<th name="gender">gender</th>
			</tr>
		</thead>
		...
	</table>

fixed

THEAD요소내의 CELL(TH또는 TD)에 fixed속성을 주어 그리드 왼편에 해당 컬럼을 고정 시킬 수 있습니다.

20px

 

400px
Attribute nametypedefaultproperties
fixedString fixed
xml
	<table>
		<thead>
			<tr>
				<th name="id" fixed="fixed">id</th>
				<th name="user_name">user_name</th>
				<th name="password">password</th>
				<th name="gender">gender</th>
			</tr>
		</thead>
		...
	</table>

parent

그리드에 rowspan과 colpan이 있다면 CELL(TH또는 TD)에 parent속성으로 부모 컬럼을 명시해주어야 합니다.

20px

 

400px
Attribute nametypedefaultproperties
parentString  
xml
	<table>
		<thead>
			<tr>
				<th rowspan="2" name="id" fixed="fixed">id</th>
				<th rowspan="2" name="user_name">user_name</th>
				<th rowspan="2" name="password">password</th>
				<th colspan="2" name="name">name</th>
			</tr>
			<tr>
				<th parent="name" name="first_name">First name</th>
				<th parent="name" name="last_name">Last name</th>
			</tr>
		</thead>
		...
	</table>