SlideShare uma empresa Scribd logo
1 de 16
Baixar para ler offline
Handlebars.js
SK planet 한정현
(kazikai84@gmail.com)
Table of Contents
• Handlebars ?
• Why Handlebars? (Mustache?)
• Getting Started
• Expression
• Helper
• built-in
• custom
• Comments
• Built-in Utility
Handlebars?
• http://handlebarsjs.com/
• https://github.com/wycats/handlebars.js/
• Mustache 템플릿 언어기반으로 만들어진 확장 템플릿
• View 와 Code 를 분리 하기 위해 만들어짐 : 로직 과 presentation 을 분리
• Mustache 템플릿에 Handlebars 확장 기능들을 사용 할수 있음
• Web site보다는 Web app에 더 적합
• 자바스크립트 코드 안에 HTML Element 를 넣지 않기 위해
not Handlebars…
var $content = $( '#content' ),
$div = $( '<div class="tab">탭 영역 입니다. </div>' ),
$gnb = $( '<h1 > header 부분 영역입니다. </h1>' ),
$input = $( '<input type="text" placeholder="텍스트" value="1" disalbed>' );
$content.append( $div ).append( $gnb ).prepend( $input );
var $content = $( '#content' ),
$div = $( '<div>' ).addClass('tab').html( '탭 영역입니다. ' ),
$gnb = $( '<h1></h1>' ).html( ' header 부분 영역입니다. '),
$input = $( '<input>' ).attr({
"type" : "text",
"placeholder" : "텍스트"
}).val( "1" ).prop( 'disalbed', true );
$content.append( $div ).append( $gnb ).prepend( $input );
var $content = $( '#content' );
function makeTemplate ( $elem, dContent, gContent ) {
var $div = $( '<div>' ).addClass('tab').html( dContent ),
$gnb = $( '<h1></h1>' ).html( gContent ),
$input = $( '<input>' ).attr({
"type" : "text",
"placeholder" : "텍스트"
}).val( "1" ).prop( 'disalbed', true );
return $elem.append( $div ).append( $gnb ).prepend( $input );
};
makeTemplate( $content, '탭 영역입니다.', 'header 부분 영역입니다.' );
너무 복잡함… JS 안에 html 이 들어가게 되고,
반복적으로 재사용 되는 코드에서는 사용 하기 힘듬 ..
-> 장점으로 jQuery를 많이 써본다..??
jQuery 스타일로 변경도 해보고..
모듈화도 해보지만..
Handlebars
<script type="text/x-handlebars-template" id="test3-template">
<input type="text" placeholder="텍스트" value=“{{value}}“ disabled>
<div class="tab">
{{dContent}}
</div>
<h1>{{gContent}}</h1>
</script>
var context3 = {
“value”: 1,
"dContent": "탭 영역입니다. ",
"gContent": "header 부분 영역입니다. "
};
var test3Tmpl = Handlebars.compile( $( '#test3-template' ).html() );
$( '#test3' ).html( test3Tmpl( context3 ) );
Template 을 만들고
JavaScript 에서 data 를 정해서 넣어주고
템플릿을 쓰는게 답이다!!
최종적으로 아래와 같이 보여짐
Why Handlebars? (Mustache?)
• handlebars template 은 컴파일 된다.
• #if , #unless, #with, #each 등을 지원
• helper를 추가할 수 있음
• path 구조를 지원 {{#each ../person.name }}
• 5배에서 7배 handlebars가 더 빠름 : https://travis-
ci.org/wycats/handlebars.js/builds/33392182#L538
Getting Started
• handlebars.js 파일 include
• 보여질 HTML 코드를 작성하고
• HTML 코드는 변경될 부분 ( 재사용 등에 의해 ) 을 {{}} expression으로 감싸 준다.
• 만들어진 HTML 코드는 다음과 같은 포맷안에 넣어준다.
• 이제 JavaScript 에서 위 Template 을 찾아 compile 한후
• 템플릿 안에 들어갈 Data 를 선언 한후 템플릿에 인자로 넣어준다.
• 마지막으로 나온 html 변수 안에는 HTML 이 들어있으므로, DOM 에 추가해주면 된다.
<div class="entry">
<h1>{{title}}</h1>
<div class="body">
{{body}}
</div>
</div>
<script type="text/x-handlebars-template" id=“template">
</script>
var source = $( ‘#template’ ).html();
var template = Handlebars.compile( source );
var context = { title : “타이틀” , “body”: “바디” };
var html = template( context ) ;
$(‘body’).append( html );
<div class="entry">
<h1>타이틀</h1>
<div class="body">
바디
</div>
</div>
Expression
• 기본 사용 법 <h1>{{title}}</h1>
• 현재 context 안에 title 속성을 표현 하고 싶을 경우 {{ title.text }}( dot 사용 가능 )
• {{ title/text }} ( / 도 사용 가능 dot 와 같다. ) {{ this.title.text }} , {{ ./title.text }} 도 동일
• ../ 도 사용 가능 ( 부모 context에 접근 하려면 필요 )
• HTML 문법이 Data에 있으면,해당 HTML 문법도 표시
• {{{ expressions }}} 를 사용하면, 자동으로 없어짐
• Whitespace Control 를 하려면 expression 앞에 ~ 를 붙히면 된다.
Helper: Built -in
• with : 템플릿에서 context 이동시에 사용
• each : 배열 형태 또는 object 형태의 context 에서 사용 : else는 데이터가 없을 경우
• each : @key , @index 를 키 값과 index 값을 표시 할수있음
Helper: Built -in
• if : context 의 조건에 따라 사용
• if 는 해당 argument 가 falsy 일때 ( false, undefined, null, “” , [] ) 일때 동작 하지 않는다.
• else 와 같이 주로 같이 사용 됨
• unless : if helper 의 반대 개념으로 값이 falsy 일때 렌더링 된다.
• log : 템플릿이 실행 되는 동안 컨텍스트를 로깅 하기 위해 사용 : {{log “look”}}
Helpers: Custom
• 기본 helper 를 제외 하고 다른 동작을 하는 helper 를 만들수 있음
• Handlebars.registerHelper() 를 사용
• registerHelper의 return 값은 자동으로 escape 처리가 됨 :
• escape 는 http://www.freeformatter.com/html-escape.html 참조
• escape 처리를 안하고 싶다면, return 하기전 new Handlebars.SafeString( [return value] ); 해주고 return을
해주면 된다. ]
• 헬퍼 다음 인자로 넣어주는 값들은 helper의 변수가 된다 ( 순서에 따라..)
Helpers: Custom
• Hash Arguments
• custom helper 를 만들때 여러가지 조건 값들을 사용 할수 있음
• key = value 로 넣은 인자들은 options.hash.key = value 로 저장되어있음
• hash 는 마지막 인자로 넣어주어야 한다.
•
Comments
• {{! }} or {{!-- --}} 를 사용
• HTML 내에서 주석 처리 할때 사용 위 2 포맷 모두 사용 가능.
• 해당 Comment는 최종 HTML 에서는 안보임
• HTML 에서 보여지는 Comment 를 원한다면 <!-- -->
Utility
• 내장 함수로. 주로 string 처리 및에 유용 함
• Handlebars.Utils.escapeExpression(string)
• HTML 과 태그들을 String 으로 표현 : new Handlebars.SafeString().toString() 과 동일함
• Handlebars.Utils.isEmpty(value)
• value 에 값이 있는지 없는지 판단
• Handlebars.Utils.extend(obj, value)
• obj 에 value 확장 ( $.extend 와 동일 )
• Handlebars.Utils.toString(obj, value)
• toString 과 동일
• Handlebars.Utils.isArray(obj, value)
• obj 가 array 인지 판단
• Handlebars.Utils.isFunction(obj, value)
• obj 가 function인지 판단
Supported Environments
• EcamScript 3이 동작하는 환경이면 동작하게 설계
• Node.js
• Chrome
• Firefox
• Safari 5+
• Opera 11+
• IE 6+
감사합니다.
• 예제 코드
• https://github.com/kazikai/handlebars

Mais conteúdo relacionado

Mais procurados

[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery정석 양
 
[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기NAVER D2
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Kyoung Up Jung
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기Kyoung Up Jung
 
Polymer Codelab: Before diving into polymer
Polymer Codelab: Before diving into polymerPolymer Codelab: Before diving into polymer
Polymer Codelab: Before diving into polymerChang W. Doh
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기WebFrameworks
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brickyongwoo Jeon
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVCArawn Park
 
Django in Production
Django in ProductionDjango in Production
Django in ProductionHyun-woo Park
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2성일 한
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?Sang-ho Choi
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드Sukjoon Kim
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는Taegon Kim
 
다시보는 Angular js
다시보는 Angular js다시보는 Angular js
다시보는 Angular jsJeado Ko
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 

Mais procurados (20)

[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery[하코사세미나] 한 시간 만에 배우는 Jquery
[하코사세미나] 한 시간 만에 배우는 Jquery
 
[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기[D2CAMPUS]JavaScript 다시 시작하기
[D2CAMPUS]JavaScript 다시 시작하기
 
Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.Django, 저는 이렇게 씁니다.
Django, 저는 이렇게 씁니다.
 
간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기간단한 블로그를 만들며 Django 이해하기
간단한 블로그를 만들며 Django 이해하기
 
Polymer Codelab: Before diving into polymer
Polymer Codelab: Before diving into polymerPolymer Codelab: Before diving into polymer
Polymer Codelab: Before diving into polymer
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기React를 이용하여 멀티플랫폼에서 개발하기
React를 이용하여 멀티플랫폼에서 개발하기
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brick
 
플라스크 템플릿
플라스크 템플릿플라스크 템플릿
플라스크 템플릿
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVC
 
4-3. jquery
4-3. jquery4-3. jquery
4-3. jquery
 
Django in Production
Django in ProductionDjango in Production
Django in Production
 
처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2처음배우는 자바스크립트, 제이쿼리 #2
처음배우는 자바스크립트, 제이쿼리 #2
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
[커빙 아키텍쳐] 커빙은 어떻게 소셜 컨텐츠를 모아올까요?
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드
 
ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는ReactJS | 서버와 클라이어트에서 동시에 사용하는
ReactJS | 서버와 클라이어트에서 동시에 사용하는
 
다시보는 Angular js
다시보는 Angular js다시보는 Angular js
다시보는 Angular js
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 

Semelhante a Handlebars

2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축Youngil Cho
 
Html5 시맨틱태그
Html5 시맨틱태그Html5 시맨틱태그
Html5 시맨틱태그은심 강
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차Michael Yang
 
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?Nts Nuli
 
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?Toby Yun
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
[전파교육] css day 2014
[전파교육] css day 2014[전파교육] css day 2014
[전파교육] css day 2014Kyoung Hwan Min
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차Michael Yang
 
Best practice of HTML5 Semantic Markup
Best practice of HTML5 Semantic MarkupBest practice of HTML5 Semantic Markup
Best practice of HTML5 Semantic MarkupToby Yun
 
2. html5 시맨틱태그
2. html5 시맨틱태그2. html5 시맨틱태그
2. html5 시맨틱태그은심 강
 
2. html5 시맨틱태그
2. html5 시맨틱태그2. html5 시맨틱태그
2. html5 시맨틱태그은심 강
 
S1.part.2.워드프레스 테마 시작하기
S1.part.2.워드프레스 테마 시작하기S1.part.2.워드프레스 테마 시작하기
S1.part.2.워드프레스 테마 시작하기082net
 
Html5_SYS4U
Html5_SYS4UHtml5_SYS4U
Html5_SYS4Usys4u
 
HTML5 스펙 소개
HTML5 스펙 소개HTML5 스펙 소개
HTML5 스펙 소개Toby Yun
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfSangHoon Han
 

Semelhante a Handlebars (20)

2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
2017 Pycon KR - Django/AWS 를 이용한 쇼핑몰 서비스 구축
 
2 1. html4.01
2 1. html4.012 1. html4.01
2 1. html4.01
 
Asp.net Razor
Asp.net Razor Asp.net Razor
Asp.net Razor
 
Html5 시맨틱태그
Html5 시맨틱태그Html5 시맨틱태그
Html5 시맨틱태그
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 4일차
 
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
[2014널리세미나] 시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
 
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
시맨틱한 HTML5 마크업 구조 설계, 어떻게 할까?
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
[전파교육] css day 2014
[전파교육] css day 2014[전파교육] css day 2014
[전파교육] css day 2014
 
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
처음부터 다시 배우는 HTML5 & CSS3 강의자료 8일차
 
웹표준 교육
웹표준 교육웹표준 교육
웹표준 교육
 
Best practice of HTML5 Semantic Markup
Best practice of HTML5 Semantic MarkupBest practice of HTML5 Semantic Markup
Best practice of HTML5 Semantic Markup
 
2. html5 시맨틱태그
2. html5 시맨틱태그2. html5 시맨틱태그
2. html5 시맨틱태그
 
2. html5 시맨틱태그
2. html5 시맨틱태그2. html5 시맨틱태그
2. html5 시맨틱태그
 
S1.part.2.워드프레스 테마 시작하기
S1.part.2.워드프레스 테마 시작하기S1.part.2.워드프레스 테마 시작하기
S1.part.2.워드프레스 테마 시작하기
 
Html5_SYS4U
Html5_SYS4UHtml5_SYS4U
Html5_SYS4U
 
HTML5 스펙 소개
HTML5 스펙 소개HTML5 스펙 소개
HTML5 스펙 소개
 
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdfASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
ASP.NET MVC Framework 개발자를 위한 Razor Syntax.pdf
 
Web_07_Rails Advanced
Web_07_Rails AdvancedWeb_07_Rails Advanced
Web_07_Rails Advanced
 

Handlebars

  • 2. Table of Contents • Handlebars ? • Why Handlebars? (Mustache?) • Getting Started • Expression • Helper • built-in • custom • Comments • Built-in Utility
  • 3. Handlebars? • http://handlebarsjs.com/ • https://github.com/wycats/handlebars.js/ • Mustache 템플릿 언어기반으로 만들어진 확장 템플릿 • View 와 Code 를 분리 하기 위해 만들어짐 : 로직 과 presentation 을 분리 • Mustache 템플릿에 Handlebars 확장 기능들을 사용 할수 있음 • Web site보다는 Web app에 더 적합 • 자바스크립트 코드 안에 HTML Element 를 넣지 않기 위해
  • 4. not Handlebars… var $content = $( '#content' ), $div = $( '<div class="tab">탭 영역 입니다. </div>' ), $gnb = $( '<h1 > header 부분 영역입니다. </h1>' ), $input = $( '<input type="text" placeholder="텍스트" value="1" disalbed>' ); $content.append( $div ).append( $gnb ).prepend( $input ); var $content = $( '#content' ), $div = $( '<div>' ).addClass('tab').html( '탭 영역입니다. ' ), $gnb = $( '<h1></h1>' ).html( ' header 부분 영역입니다. '), $input = $( '<input>' ).attr({ "type" : "text", "placeholder" : "텍스트" }).val( "1" ).prop( 'disalbed', true ); $content.append( $div ).append( $gnb ).prepend( $input ); var $content = $( '#content' ); function makeTemplate ( $elem, dContent, gContent ) { var $div = $( '<div>' ).addClass('tab').html( dContent ), $gnb = $( '<h1></h1>' ).html( gContent ), $input = $( '<input>' ).attr({ "type" : "text", "placeholder" : "텍스트" }).val( "1" ).prop( 'disalbed', true ); return $elem.append( $div ).append( $gnb ).prepend( $input ); }; makeTemplate( $content, '탭 영역입니다.', 'header 부분 영역입니다.' ); 너무 복잡함… JS 안에 html 이 들어가게 되고, 반복적으로 재사용 되는 코드에서는 사용 하기 힘듬 .. -> 장점으로 jQuery를 많이 써본다..?? jQuery 스타일로 변경도 해보고.. 모듈화도 해보지만..
  • 5. Handlebars <script type="text/x-handlebars-template" id="test3-template"> <input type="text" placeholder="텍스트" value=“{{value}}“ disabled> <div class="tab"> {{dContent}} </div> <h1>{{gContent}}</h1> </script> var context3 = { “value”: 1, "dContent": "탭 영역입니다. ", "gContent": "header 부분 영역입니다. " }; var test3Tmpl = Handlebars.compile( $( '#test3-template' ).html() ); $( '#test3' ).html( test3Tmpl( context3 ) ); Template 을 만들고 JavaScript 에서 data 를 정해서 넣어주고 템플릿을 쓰는게 답이다!! 최종적으로 아래와 같이 보여짐
  • 6. Why Handlebars? (Mustache?) • handlebars template 은 컴파일 된다. • #if , #unless, #with, #each 등을 지원 • helper를 추가할 수 있음 • path 구조를 지원 {{#each ../person.name }} • 5배에서 7배 handlebars가 더 빠름 : https://travis- ci.org/wycats/handlebars.js/builds/33392182#L538
  • 7. Getting Started • handlebars.js 파일 include • 보여질 HTML 코드를 작성하고 • HTML 코드는 변경될 부분 ( 재사용 등에 의해 ) 을 {{}} expression으로 감싸 준다. • 만들어진 HTML 코드는 다음과 같은 포맷안에 넣어준다. • 이제 JavaScript 에서 위 Template 을 찾아 compile 한후 • 템플릿 안에 들어갈 Data 를 선언 한후 템플릿에 인자로 넣어준다. • 마지막으로 나온 html 변수 안에는 HTML 이 들어있으므로, DOM 에 추가해주면 된다. <div class="entry"> <h1>{{title}}</h1> <div class="body"> {{body}} </div> </div> <script type="text/x-handlebars-template" id=“template"> </script> var source = $( ‘#template’ ).html(); var template = Handlebars.compile( source ); var context = { title : “타이틀” , “body”: “바디” }; var html = template( context ) ; $(‘body’).append( html ); <div class="entry"> <h1>타이틀</h1> <div class="body"> 바디 </div> </div>
  • 8. Expression • 기본 사용 법 <h1>{{title}}</h1> • 현재 context 안에 title 속성을 표현 하고 싶을 경우 {{ title.text }}( dot 사용 가능 ) • {{ title/text }} ( / 도 사용 가능 dot 와 같다. ) {{ this.title.text }} , {{ ./title.text }} 도 동일 • ../ 도 사용 가능 ( 부모 context에 접근 하려면 필요 ) • HTML 문법이 Data에 있으면,해당 HTML 문법도 표시 • {{{ expressions }}} 를 사용하면, 자동으로 없어짐 • Whitespace Control 를 하려면 expression 앞에 ~ 를 붙히면 된다.
  • 9. Helper: Built -in • with : 템플릿에서 context 이동시에 사용 • each : 배열 형태 또는 object 형태의 context 에서 사용 : else는 데이터가 없을 경우 • each : @key , @index 를 키 값과 index 값을 표시 할수있음
  • 10. Helper: Built -in • if : context 의 조건에 따라 사용 • if 는 해당 argument 가 falsy 일때 ( false, undefined, null, “” , [] ) 일때 동작 하지 않는다. • else 와 같이 주로 같이 사용 됨 • unless : if helper 의 반대 개념으로 값이 falsy 일때 렌더링 된다. • log : 템플릿이 실행 되는 동안 컨텍스트를 로깅 하기 위해 사용 : {{log “look”}}
  • 11. Helpers: Custom • 기본 helper 를 제외 하고 다른 동작을 하는 helper 를 만들수 있음 • Handlebars.registerHelper() 를 사용 • registerHelper의 return 값은 자동으로 escape 처리가 됨 : • escape 는 http://www.freeformatter.com/html-escape.html 참조 • escape 처리를 안하고 싶다면, return 하기전 new Handlebars.SafeString( [return value] ); 해주고 return을 해주면 된다. ] • 헬퍼 다음 인자로 넣어주는 값들은 helper의 변수가 된다 ( 순서에 따라..)
  • 12. Helpers: Custom • Hash Arguments • custom helper 를 만들때 여러가지 조건 값들을 사용 할수 있음 • key = value 로 넣은 인자들은 options.hash.key = value 로 저장되어있음 • hash 는 마지막 인자로 넣어주어야 한다. •
  • 13. Comments • {{! }} or {{!-- --}} 를 사용 • HTML 내에서 주석 처리 할때 사용 위 2 포맷 모두 사용 가능. • 해당 Comment는 최종 HTML 에서는 안보임 • HTML 에서 보여지는 Comment 를 원한다면 <!-- -->
  • 14. Utility • 내장 함수로. 주로 string 처리 및에 유용 함 • Handlebars.Utils.escapeExpression(string) • HTML 과 태그들을 String 으로 표현 : new Handlebars.SafeString().toString() 과 동일함 • Handlebars.Utils.isEmpty(value) • value 에 값이 있는지 없는지 판단 • Handlebars.Utils.extend(obj, value) • obj 에 value 확장 ( $.extend 와 동일 ) • Handlebars.Utils.toString(obj, value) • toString 과 동일 • Handlebars.Utils.isArray(obj, value) • obj 가 array 인지 판단 • Handlebars.Utils.isFunction(obj, value) • obj 가 function인지 판단
  • 15. Supported Environments • EcamScript 3이 동작하는 환경이면 동작하게 설계 • Node.js • Chrome • Firefox • Safari 5+ • Opera 11+ • IE 6+
  • 16. 감사합니다. • 예제 코드 • https://github.com/kazikai/handlebars